Welcome 微信登录

首页 / 网页编程 / PHP / 为PHP应用提速、提速、再提速!第3部分

为PHP应用提速、提速、再提速!第3部分2009-11-05Martin Streicher为PHP应用提速、提速、再提速!第3 部分: 用Memcache 守护程序把数据缓存到内存中

本系列文章的前两篇文章提供了为PHP 应用程序提速的技术。第1 部分介绍了XCache,它是把PHP 操作码缓存到内存中的PHP 扩展。XCache 将避免代价高昂且(严格来说)不必要的花费来重新编译相同的PHP 代码去交付一个页面。XCache 是免费的开源软件,安装费时不多却可提供巨大回报。第2 部分介绍了XDebug,它是配置PHP 代码的PHP 扩展。XDebug 是类似于软件x 光照片的内容:它将深入应用程序,揭露内部工作原理,并且揭示代码如何度过其周期。拥有了XDebug 度量之后 —— 而不是之前 —— 您可以优化代码来调整算法、减少瓶颈并减轻过多的内存使用。

注:XCache 适于生产使用。在开发过程中使用 XDebug 最佳,因为其计算负载在活动计算机中是十分浪费的。

这一次,让我们探究第三种尤为有效的性能增强因素。名为 memcached 的 Memcache 守护程序是一种高性能的分布式对象缓存。memcached 的安装位置介于应用程序与数据存储之间,它将把对象保存在 RAM 中。

Memcache PHP 扩展将为访问缓存提供一个简单的应用程序接口 (API)。要使用缓存,需要调用 API 来确定先前是否已缓存了对象。如果已经缓存,只需检索该对象并继续进行处理。否则,转至数据库、获取必需的数据、将其映射到对象中并把它添加到缓存中。在那里,memcached 将最小化或消除针对您先前处理过的信息的数据库查询。

如果 XCache 和 XDebug 是涡轮增压器,那么 memcached 就是喷气发动机。请准备好点燃加力燃烧室。

更高的速度需求

通常,PHP 应用程序中最耗费时间的任务是数据检索。实际上,用于从存储库(文件或数据库服务器)中获取信息的时间远高于编译并且甚至是执行 PHP 程序所需耗费的时间。连接至数据库服务器所需的时间是一次延迟,等待查询完成添加附加停顿,并且结果的传输甚至会导致更多延迟。此外,如果代码使用对象,则有指向对象的导致负担过重的映射平面行。

MySQL 可以使用其查询缓存为查询阶段提速。您还可以复制数据库(一个主数据库,多个副本),从而在多个 CPU 之间分担查询处理的负担。但是,一旦底层表改变,MySQL 查询缓存的内容就会过时。而且,仅当一个查询与先前查询相同时,查询缓存才会被命中。副本也有限制。例如,无法分布数据库写操作。

从根本上说,虽然查询缓存和数据库副本都是有目的的并且在整体工作负载管理策略中占有地位(查询缓存将消耗一些内存,但是在其他方面却很节省;副本将把灾难停机的风险降至最低),但是连接和传输时间不变。

Memcache PHP 扩展将把对象缓存到 RAM 中。每次缓存命中将替换到数据库服务器的一次往返,使应用程序运行得更快。您很可能会发现 memcached 也(间接地)提高了数据库服务器的性能;由于 memcached 将用作替代持久性存储,因此到达数据库服务器的请求更少,使数据库服务器可以更高效地响应已收到的查询。

您可以在一台或多台服务器上运行 memcached,并且将在所有节点之间复制缓存的内容。如果服务器出现故障,客户机 API 软件将把缓存读写操作重新路由到正常运行的备用服务器上。

不同于 XCache,您必须修改代码才能集成 memcached。不过,如果您已经小心地隔离了一些对象方法内的数据库访问代码,则修改将很可能十分轻微且集中。

Danga Interactive 编写的 Memcache 守护程序是由 Berkeley Software Distribution (BSD) License 的自由条款许可的免费开源软件。守护程序应当可以轻松地构建在 UNIX® 和 Linux® 系统上,也可以构建在 Mac OS X 和 Microsoft® Windows® 上。很多 Linux 发行版都提供了 memcached 包;请查看包存储库。如果使用 Mac OS X 或 Windows 并且更喜欢便捷的预构建二进制,则可以通过简单的 Google 搜索在 Web 上找到此类软件。

(重新)构建 PHP

让我们在 Debian Linux 上构建、安装和部署 memcached。要加速执行过程并允许您独立于现有 Web 服务器基础设施来测试 memcached,请使用 XAMPP Apache 发行版作为构建的基础。XAMPP 十分易于安装并且包含 Apache V2、MySQL、PHP V4 和 V5、Perl、许多库和许多 Web 应用程序(例如 phpMyAdmin)。如果从未从头开始构建 Linux、Apache、MySQL 和 PHP (LAMP) 堆栈,或者如果需要避免与此类努力相关联的争辩,则以 XAMPP 开始是十分理想的。

注:如果您以前通过源代码构建了 PHP 并保留了文件,则只需把 --enables-memcache 选项添加到配置开关列表中,并且跳过构建 memcached 和 PHP Memcache 扩展以前所示的步骤。

要构建和部署 memcached,您需要 XAMPP 发行版,包括 XAMPP 开发文件、XAMPP 附带的 PHP 版本的源代码以及 memcached 的源代码和 Memcache 的 PHP 扩展。您可以从 XAMPP 下载 XAMPP 二进制和 XAMPP 开发文件(构建附加组件的必备文件)。您还可以使用 wget 快速获取软件:

$ wget "http://www.apachefriends.org/download.php?xampp-linux-1.6.tar.gz"
$ wget "http://www.apachefriends.org/download.php?xampp-linux-devel-1.6.tar.gz"

前一个 tarball(tarball 是压缩的 .tar 文件并且通常以后缀 .tar.gz 为结尾)包含二进制;后一个 tarball 包含针对 XAMPP 系统构建代码所需的题头文件。

虽然可以把 XAMPP 锚定在文件系统中的任意位置,但是请把压缩包安装到 /opt 中。同时把开发文件安装到 /opt 中。使用 /opt 将使剩下的构建过程变得更轻松。对 tar 使用 -C 选项把文件直接解压缩到 /opt 中,如下所示:

清单 1. 把文件直接解压缩到 /opt 中

$ sudo mkdir /opt
$ tar xzf xampp-linux-1.6.tar.gz -C /opt
$ tar xzf xampp-linux-devel-1.6.tar.gz -C /opt
$ ls -CF /opt/lampp
RELEASENOTES error/ info/ logs/ phpsqliteadmin/
backup/ etc/ lampp* man/ sbin/
bin/ htdocs/ lib/ manual/ share/
build/ icons/ libexec/ modules/ tmp/
cgi-bin/ include/ licenses/ phpmyadmin/ var/

接下来,下载并解压缩 XAMPP 附带的 PHP 版本的源代码(XAMPP V1.6 绑定了 PHP V4.4.6);从 PHP.net 下载 PHP V4.4.6 的代码。wget 将再次使您可以轻而易举地完成任务:

$ wget http://us2.php.net/get/php-4.4.6.tar.bz2/from/www.php.net/mirror
$ tar xjf php-4.4.6.tar.bz2
$ cd php-4.4.6

接下来,修改 XAMPP 的 PHP 构建脚本重新构建 PHP 以启用 Memcache。您可以在 /opt/lampp/share/lampp/configures.tar.gz 中找到原始构建脚本(和其他构建脚本)。使用以下代码解压缩 PHP V4 构建脚本:

$ tar xzfv /opt/lampp/share/lampp/configures.tar.gz
php/configure-php4-oswald