【问题标题】:How to get Google like speeds with php?如何使用 php 获得类似 Google 的速度?
【发布时间】:2009-02-20 20:49:31
【问题描述】:

我使用 PHP 和 Zend 框架,单独连接数据库似乎比 Google 执行查询所需的 0.02 秒要长。奇怪的是,我今天看了一段视频,说谷歌连接到 1000 台服务器进行一次查询。由于延迟,我希望每个查询都使用一台服务器比在不同的数据中心使用多台服务器处理数据更有效。

我如何让 PHP、MySQL 和 Zend 框架协同工作并达到同样出色的速度?

缓存是唯一的方法吗?如何优化代码以减少“渲染”时间。

【问题讨论】:

  • 用 PHP 和 MySQL 做不到...
  • 200ms = 0.2 秒顺便说一句。您应该能够在 php 中做到 that 吗?
  • 首先,是 Google 显示生成页面(连接、查询、回显...)的实际时间,还是只是执行查询的时间?我相信这只是查询。我有很多页面需要 0.05 秒才能加载整个页面。
  • 0.2秒和0.02秒相差很大...
  • @Darryl @Coltin supplues 链接表示响应时间为 200 毫秒。

标签: php apache optimization performance


【解决方案1】:

Google 使用多种技术来实现其提供的吞吐量。 MapReduceGoogle File SystemBigTable 是其中一些。

有一些非常好的免费和开源替代方案,即Apache HadoopApache HBaseHypertable。雅虎!大量使用和推广 Hadoop 项目,因此它们得到了积极的维护。

【讨论】:

  • 谢谢。 (这里得写点东西)
【解决方案2】:

我在 Zend 框架中使用 PHP 和单独的数据库连接似乎 花费超过 0,02 秒 Google 需要进行查询。

无论您是谁,数据库连接操作都是重量级的:使用连接池,这样您就不必为每个请求初始化资源。

性能是关于架构而不是语言。

【讨论】:

  • +1 表示“性能与架构有关,而不是语言”。我讨厌这些问题:P
【解决方案3】:

不久前,Google 决定将所有内容都放入 RAM。

http://googlesystem.blogspot.com/2009/02/machines-search-results-google-query.html

如果您永远不必查询硬盘驱动器,您的结果将会显着提高。缓存是有帮助的,因为您不会查询硬盘驱动器,但是当缓存未命中时您仍然会这样做(除非您的意思是使用 PHP 进行缓存,这意味着您只有在修改源代码时才编译 PHP 程序)。

【讨论】:

  • 如何检查我的数据库是否完全在内存中?
  • Google 正在使用我怀疑的数据库引擎。我不认为你可以强制 MySQL 将整个数据库放在 RAM 中。
  • 你可以一直使用 MySQL 集群!所有这些都进入 RAM,偶尔检查点到磁盘。不过,设置非常先进。您也可以使用所有内存表,但会“噗!”如果服务器出现故障。
  • 您可以在您的数据库之上设置缓存解决方案,例如 memcached 或 APC。
  • 需要注意的是,缓存是一种利用时间和空间局部性来利用少量快速内存的方法。在这种情况下,将所有内容都放入更快的介质(RAM 与硬盘驱动器相对,SRAM 与 DRAM 相对)将消除对大多数缓存需求的需求。
【解决方案4】:

这真的取决于你想做什么,但这里有一些例子:

  • 使用说明分析您的查询。在您的开发环境中,您可以将查询和执行时间输出到页面底部 - 减少查询数量和/或优化那些较慢的查询。

  • 使用缓存层。看起来 Zend 可以启用内存缓存。通过将请求发送到超高速缓存层而不是数据库,这可能会极大地加速您的应用程序。

  • 查看您的前端加载时间。在 Firebug 中使用 Yahoo 的 YSlow 插件。限制 http 请求,设置远期标头以缓存 js、css 和图像。等等。

如果您优化应用程序的每一层,您可以在您的网络应用程序上获得闪电般的速度,可能不如谷歌那么快。您的数据库连接时间可能不是您的应用程序中最慢的部分。

【讨论】:

    【解决方案5】:

    Memcached 是在 Linux 上优化内存中存储/检索的推荐解决方案。

    【讨论】:

      【解决方案6】:

      默认情况下,PHP 脚本每次被 http 服务器调用时都会被解释,因此每次调用都会启动脚本解析,并且可能会被 Zend 引擎编译。 您可以通过使用脚本缓存(如 APC)来摆脱这个瓶颈。它将曾经编译的 PHP 脚本保存在内存/磁盘中,并将其用于所有后续请求。收益通常很显着,尤其是在使用 ZF 等复杂框架创建的 PHP 应用程序中。

      默认情况下,每个请求都会打开一个到数据库的连接,因此您应该使用某种数据库连接池或持久连接(这并不总是有效,取决于 http 服务器/php 配置)。我从未尝试过,但也许有一种方法可以使用 memcache 来保持数据库连接句柄。

      您还可以使用 memcache 来保存会话数据,如果它们被用于每个请求。它们的持久性并不那么重要,而 memcache 有助于使其变得非常快。

      实际的“问题”是 PHP 的工作方式与其他框架有点不同,因为它以 SSI(服务器端包含)方式工作 - 每个请求都由 http 服务器处理,如果它需要运行 PHP 脚本,它的初始化解释器并加载、解析、编译和运行脚本。这可以比作上车,启动发动机,然后跑了 10 米。

      另一种方式是应用程序服务器方式,其中 Web 应用程序本身在自己的循环中处理请求,始终共享数据库连接,而不是一遍又一遍地初始化运行时。该解决方案提供了更低的延迟。另一方面,这可以与已经在一辆正在行驶的汽车中并使用它行驶相同的 10 米进行比较。 ;)

      上述缓存/预编译和池化解决方案是减少初始化开销的最佳方案。 PHP/MySQL 仍然是一个基于 RDBMS 的解决方案,BigTable 只是一个大的、分片的、大规模分布的哈希表是有充分理由的(我知道有点过于简单化了)——请阅读High Scalability

      【讨论】:

        【解决方案7】:

        如果是搜索引擎,瓶颈是数据库,取决于它的大小。

        为了加快对大型集的全文搜索,您可以使用Sphinx。它可以配置在一台或多台服务器上。但是,您将不得不调整现有的查询代码,因为 Sphinx 作为搜索守护进程运行(大多数语言都可以使用库)

        【讨论】:

          【解决方案8】:

          Google 拥有一个庞大、高度分布式的系统,其中包含许多专有技术(包括他们自己的硬件以及操作、文件和数据库系统)。

          这个问题就像在问:“我怎样才能让我的车变成卡车?”而且基本上没有意义。

          【讨论】:

            【解决方案9】:

            根据@Coltin 提供的链接,Google 响应时间在 0.2 秒左右,而不是 0.02 秒。只要您的应用程序具有高效的设计,我相信您应该能够在很多平台上实现这一点。虽然我不知道 PHP,但如果 0.2 秒是个问题,我会感到惊讶。

            【讨论】:

              【解决方案10】:
              • APC 代码缓存;
              • Zend_Cache 与 APC 或 Memcache 后端;
              • 静态文件的 CDN;

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2023-03-14
                • 1970-01-01
                • 2015-01-25
                • 1970-01-01
                • 2022-10-31
                • 1970-01-01
                • 1970-01-01
                • 2013-10-02
                相关资源
                最近更新 更多