English 中文(简体)
如何使用php获得类似Google的速度?
原标题:
  • 时间:2009-02-20 20:49:31
  •  标签:

我正在使用Zend框架和PHP,但连接数据库似乎比Google查询0.02秒更耗时。今天我看了一个视频,说Google为单个查询连接了1000个服务器,这太奇怪了。考虑到延迟,每个查询连接一个服务器比在不同数据中心使用多个服务器处理更有效。

我如何让PHP,MySQL和Zend Framework一起运作并实现同等的极速?

缓存是否是唯一的方式?如何优化您的代码以减少“呈现”时间。

问题回答

谷歌使用许多技术来实现其提供的吞吐量,其中包括MapReduce、Google文件系统和BigTable。

这些东西都有一些非常好的免费和开源的替代品,即Apache HadoopApache HBaseHypertable。 Yahoo! 正在广泛使用和推广 Hadoop 项目,因此它们得到了积极的维护保养。

I am using PHP with the Zend Framework and Database connects alone seem to take longer than the 0,02 seconds Google takes to do a query.

不管你是谁,数据库连接操作都非常耗资源: 使用连接池,这样你就不必为每一个请求初始化资源。

表现取决于架构而不是语言。

一段时间前,谷歌决定将所有数据存储到RAM中。

将此翻译成中文:http://googlesystem.blogspot.com/2009/02/machines-search-results-google-query.html

如果您从未查询硬盘,那么您的结果将显着提高。缓存有所帮助,因为您不需要频繁查询硬盘,但是当缓存未命中时,仍然需要查询硬盘(除非您是指使用PHP进行缓存,这意味着仅在源代码被修改后才编译PHP程序)。

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

  • 使用explain分析您的查询。在您的开发环境中,您可以将查询和执行时间输出到页底,减少查询次数和/或优化较慢的查询。

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

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

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

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

PHP scripts by default are interpreted every time they are called by the http server, so every call initiates script parsing and probably compilation by the Zend Engine. You can get rid of this bottleneck by using script caching, like APC. It keeps the once compiled PHP script in memory/on disk and uses it for all subsequent requests. Gains are often significant, especially in PHP apps created with sophisticated frameworks like ZF.

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

如果会在每个请求中使用,您还可以使用memcache来保留会话数据。它们的持久性并不那么重要,memcache可以帮助使它们非常快速。

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

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

以上的缓存/预编译和池化解决方案是减少初始化负载最好的选择。虽然PHP / MySQL仍然是基于关系型数据库管理系统的解决方案,但是为什么BigTable只是一个大型、分片、高度分布式的哈希表(有点简化了,我知道)也有一个很好的理由-请阅读高可伸缩性。

If it s for a search engine, the bottleneck is the database, depending of its size.

In order to speed-up search on full text on a large set, you can use Sphinx. It can be configured either on 1 or multiple servers. However, you will have to adapt existing querying code, as Sphinx runs as a search daemon (libs are available for most languages)

Google have a massive, highly distributed system that incorporates a lot of proprietary technology (including their own hardware, and operating, file and database systems).

The question is like asking: "How can I make my car be a truck?" and essentially meaningless.

According to the link supplied by @Coltin, google response times are in the region of .2 seconds, not .02 seconds. As long as your application has an efficient design, I believe you should be able to achieve that on a lot of platforms. Although I do not know PHP it would surpise me if .2 seconds is a problem.

  • APC code caching;
  • Zend_Cache with APC or Memcache backend;
  • CDN for the static files;




相关问题
热门标签