为 PHP 应用提速 Xcache

简介: PHP 是一种脚本语言,常用于创建 Web 应用程序。它易于掌握,并能迅速生成可视化结果。然而,由于 PHP 是以解释的方式执行的,所以 PHP 代码每次执行时都会被解析和转换成操作码(opcode)。

PHP 是一种脚本语言,常用于创建 Web 应用程序。它易于掌握,并能迅速生成可视化结果。然而,由于 PHP 是以解释的方式执行的,所以 PHP 代码每次执行时都会被解析和转换成操作码(opcode)。操作码缓存能消除这项重复的工作,使 PHP 应用程序运行得更快。

 

在很短的时间内,PHP 成为了一种非常流行的开发 Web 应用程序的程序设计语言。对初学者来说,PHP 易于安装和学习。对于有经验的开发人员而言,PHP(从 V5 开始)提供了强大的面向对象特性。PHP 开发人员拥有庞大的群体,大量的开源及商业库和工具扩展了该核心语言的功能。PHP 能迅速产生可视化结果,因此备受众人推崇。

 

与其他开发 Web 应用程序的脚本语言(包括 Perl、Python 和 Ruby)相似,每次 HTTP 请求调用时,PHP 代码都会被解析和翻译为操作码(PHP 引擎直接执行的原语指令 —— 类似于汇编语言)再执行。在要求很低或可忽略的情况下,服务器看上去能立即执行这个复杂的解释过程。但是一旦处理的页面增加,解释 —— 从本质上说,重复工作 —— 就会对服务器造成很大的负担。在某些情况下,“编译” PHP 代码的时间会远远超过执行该代码所需的时间。因此,当需求增加时,您常常会自食其果,因为处理这些不断解释和动态生成的页面需要消耗更多的系统资源。

若 您对处理器和 RAM 的预算没有限制,那么就大可不必通过优化应用栈(硬件、操作系统、数据库、Web 服务器和 PHP 代码)来保证站点的可响应性。然而,由于资金通常都是最缺乏的资源,所以改善性能是必不可少的。调优意味着对系统增加内存、修改操作系统参数、加速 Web 或数据库服务器、提高代码效率或者这其中的一些组合。每一项都有其各自的作用。

不要浪费周期 —— 重复使用

节约 CPU 周期的另一种方法是减少运行 PHP 应用程序所需的重复工作。当然,没有必要每次都把同样的 PHP 代码翻译一遍。PHP 代码被翻译成操作码后,可以把它保存起来并重复使用 —— 直到原始代码被修改。确实,缓存 —— 用于保存和重用 PHP 操作码 —— 是几种 PHP 加速器内部的机制,包括开源 Alternative PHP Cache (APC)、支持 PHP 的 Turck MMCache、XCache、eAccelerator 和商业 Zend Platform。后三类加速器能够缓存和优化字节码,这为系统提供了更多的速度提升。

这个月,我将探究如何安装、部署和配置 XCache。XCache 相对较新,但是很多站点使用它的效果都很好。此外,XCache 易于构建、安装和配置,因为它是做为 PHP 扩展实现的。不需对 Apache 和 PHP 进行重编译。

本 文基于 XCache V1.2.0。它可为 PHP V4.3.11 至 V4.4.4、PHP V5.1.x 至 V5.2.x 以及 PHP V6 的早期版本提供可靠支持(XCache 并不支持 PHP V5.0.x)。XCache 兼容 mod_php 和 FastCGI 但并不支持 Common Gateway Interface (CGI) 和命令行 PHP 解释器。XCache 源代码能构建在许多系统上,包括 FreeBSD、Sun Solaris、Linux® 和这里所示的 Mac OS X。使用 Cygwin UNIX® 仿真环境或 Visual C,能在 Microsoft® Windows® 上构建 XCache。还可以为 Cygwin 或原生 Win32 构建 XCache。后者与 PHP 的官方 Win32 版本兼容。

本文的演示基于 Apache V2.2.3、PHP V5.2.0、XCache V1.2.0(2006 年 10 月发布)和 Mac OS X V10.4.8 Tiger 上的 Xcode V2.4.1。硬件平台为配有 2-GHz Intel® Core Duo 处理器和 2 GB RAM 的 Apple MacBook。

构建 XCache 的基本步骤

在开始之前,首先确保 PHP 正常安装并核实 phpize 是否位于 shell 的 PATH 下。同时,还需要一个 C 编译器,例如 GNU Compiler Collection (GCC),和一组包含 make 和 m4 的开发工具。在 Mac OS X 上,免费的 Xcode 软件开发环境提供了必需的构建工具。

完成以下操作步骤,在 Mac OS X 上构建、部署 XCache 并对其进行性能检测。在其他平台上构建 XCache 与之类似。如果使用 Linux,则其发行版可能已经包含了 XCache 或者已经将其以预先打包好的格式提供给您。

增加 Mac OS X 的共享内存

首先增加 Mac OS X 上留出的共享内存总量。要实现这一目的,需创建(或编辑)文件 /etc/sysctl.conf 并创建如下条目:

 

清单 1. 增加 Mac OS X 上留出的共享内存总量

 

				

 

kern.sysv.shmmax=33554432

 

kern.sysv.shmmin=1

 

kern.sysv.shmmni=32

 

kern.sysv.shmseg=8

 

kern.sysv.shmall=8192

 

 

这些设置把共享内存总量增加到了 32 MB。如还需进一步扩展共享内存,可以把 kern.sysv.shmall 设定为 kern.sysv.shmmax 除以硬件页面大小。使用 sysctl hw.pagesize 能获得硬件页面大小。例如,假设需要 128 MB 的共享内存,那么设定 kern.sysv.shmmax=134217728 并设定 kern.sysv.shmall=32768。

重启 Mac OS X 使修改生效。重启后,检验新设置是否生效,键入:

sysctl -a | grep kern.sysv

 

 

通过源代码构建 XCache

接下来,通过源代码构建 XCache。从 http://xcache.lighttpd.net 处下载源代码。下载完后解压代码,并转换到 .tar 文件创建的新目录。

 

清单 2. 通过源代码构建 XCache

 

				

 

$ cd /tmp

 

$ wget http://210.51.190.228/pub/XCache/Releases/xcache-1.2.0.tar.gz

 

$ tar xzf xcache-1.2.0.tar.gz

 

$ cd xcache

 

 

运行 phpize 为编译 XCache 做准备。

 

清单 3. 运行 phpize

 

				

 

$ phpize

 

Configuring for:

 

PHP Api Version: 20020918

 

Zend Module Api No: 20020429

 

Zend Extension Api No: 20050606

 

 

运行 configure,创建适合于原生操作系统的 makefile。

 

清单 4. 运行 configure 创建 makefile

 

				

 

$ ./configure --enable-xcache --enable-xcache-coverager

 

checking build system type... i686-apple-darwin8.8.1

 

checking host system type... i686-apple-darwin8.8.1

 

...

 

creating libtool

 

configure: creating ./config.status

 

config.status: creating config.h

 

 

此处,--enable-xcache 选项包含 XCache 支持,--enable-xcache-coverager 选项包含用于测量加速器功效的附加特性。要启用操作码优化,添加 --enable-xcache-optimizer。

当然,下一步将使用 make 命令行构建和安装代码。运行 make,然后作为 root 用户运行 make install 。

 

清单 5. 利用 make 构建和安装代码

 

				

 

$ make

 

...

 

cp ./xcache.so /Users/strike/tmp/xcache/modules/xcache.so

 

Build complete.

 

 

$ sudo make install

 

Installing shared extensions: /usr/lib/php/extensions/no-debug-non-zts-20020429/

 

 

如果上述两项操作顺利完成,那么 XCache 将位于 /usr/lib/php/extensions/no-debug-non-zts-20020429/xcache.so。(路径 /usr/lib/php/extensions/no-debug-non-zts-20020429 反映了正在使用的 API 版本和用于构建 PHP 的编译选项。如果启用了试用的 Zend Thread Safety 特性,则 "no-debug" 应为 "debug","non-zts" 应为 "zts"。)

修改 php.ini 文件

因为安装了扩展,所以必需修改 php.ini 文件,使之包含 XCache 扩展并对其进行配置。打开文件 /private/etc/php.ini,在其中添加如下代码行:

 

清单 6. 为 XCache 扩展修改 php.ini 文件

 

				

 

[xcache-common]

 

zend_extension = /usr/lib/php/extensions/no-debug-non-zts-20020429/xcache.so

 

 

[xcache.admin]

 

; Change xcache.admin.user to your preferred login name

 

xcache.admin.user = "admin"

 

 

; Change xcache.admin.pass to the MD5 fingerprint of your password

 

; Use md5 -s "your_secret_password" to find the fingerprint

 

xcache.admin.pass = "0ad72f3f352fcd8acdf266bafd0ac48d"

 

 

[xcache]

 

; Change xcache.size to tune the size of the opcode cache

 

xcache.size = 24M

 

xcache.shm_scheme = "mmap"

 

xcache.count = 2

 

xcache.slots = 8K

 

xcache.ttl = 0

 

xcache.gc_interval = 0

 

 

; Change xcache.var_size to adjust the size of variable cache

 

xcache.var_size = 8M

 

xcache.var_count = 1

 

xcache.var_slots = 8K

 

xcache.var_ttl = 0

 

xcache.var_maxttl = 0

 

xcache.var_gc_interval = 300

 

xcache.test = Off

 

xcache.readonly_protection = On

 

xcache.mmap_path = "/tmp/xcache"

 

xcache.coredump_directory = ""

 

xcache.cacher = On

 

xcache.stat = On

 

xcache.optimizer = Off

 

 

[xcache.coverager]

 

xcache.coverager = On

 

xcache.coveragedump_directory = ""

 

 

注意:为了简明起见,此处省略了一些注释。要了解每个参数的含义,请参阅 XCache 源代码中 xcache.ini 文件设置的例子。

操作码和变量缓存的大小是 32 MB,这是 /etc/rc 留出的最大值。对于 Mac OS X,xcache.mmap_path 必须为文件名。因为 PHP 代码将在 MacBook 上运行,所以 xcache.count 应设为 2,表示 MacBook 中 CPU 的数量。要访问 XCache 统计信息页面,需改变 xcache.admin.pass 设置。运行:

$ md5 -s "password"

 

 

此处 password 为您的密码。把输出复制给 xcache.admin.pass。例如,若需将密码设定为 op3nsesam3,可以运行:

$ md5 -s "op3nsesam3"

 

MD5 ("op3nsesam3") = cd959ac3debe8f587546a3fa353b3268

 

 

然后把 cd959ac3debe8f587546a3fa353b3268 复制给 xcache.admin.pass。

重启 Web 服务器

设置好 XCache 后,重启 Apache Web 服务器。对于大多数系统,可以以 root 用户的身份使用 apachectl restart 进行重启。

$ sudo apachectl restart

 

/usr/sbin/apachectl restart: httpd restarted

 

 

创建程序以调用 phpinfo()

检验 XCache 是否已启用,需创建一个小型 PHP 程序用于调用 phpinfo() 并在 Web 浏览器中打开那个文件。这样就能看到类似下图的 XCache 版面。

 

图 1. phpinfo() 方法给出了 XCache 设置

 

phpinfo() 方法给出了 XCache 设置

 

 

监控 XCache

要监控 XCache,需安装 XCache 源代码的 admin 目录中的管理页面。把整个 admin 目录复制到 Apache 文档根目录下。通常来说,Mac OS X 中的文档根目录为 /Library/WebServer/Documents。

$ cp -pr admin /Library/WebServer/Documents

 

 

复制完成后,使用 sudo apachectl restart 重启 Web 服务器。用浏览器打开 http://localhost/admin,检验管理面板是否工作正常。请参阅类似图 2 的面板。

 

图 2. XCache Administration 面板

 

XCache Administration 面板

 

 

测试应用程序

选择一个或两个应用程序进行测试。您可以使用自己的代码或者,如果想要更复杂一点,使用大型的 PHP 应用程序,例如 phpMyAdmin 或者 Serendipity

运行性能检测

Apache HTTP Web 服务器提供了一个叫做 ab 的工具,即 Apache HTTP 服务器性能检测(benchmark)工具的缩写。ab 用于为 PHP 页面自动化处理大量的请求。phpMyAdmin 应用程序将会是一个很好的选择,因为它很可能已经安装到您的系统上了。

ab 工具易于使用:只需提供给它一个重复数和一个 URL。ab 工具对这个 URL 提交若干次请求并返回统计信息。由于 XCache 已启用,所以第一个性能检测显示了加速后的性能。

在运行 ab 之前,用浏览器导航到 http://localhost/phpmyadmin/。访问这个 PHP 页面一次,便会加载用来将此页呈现到缓存内的所有 PHP 代码。此时,运行如下的性能检测,重复 100000 次。

 

清单 7. phpMyAdmin 的性能检测

 

				

 

$ ab -n 100000 http://localhost/phpmyadmin

 

...

 

Concurrency Level: 1

 

Time taken for tests: 14.597 seconds

 

Complete requests: 100000

 

Failed requests: 98262

 

(Connect: 49131, Length: 49131, Exceptions: 0)

 

Broken pipe errors: 0

 

Non-2xx responses: 50869

 

Total transferred: 25739714 bytes

 

HTML transferred: 12005084 bytes

 

Requests per second: 6850.72 [#/sec] (mean)

 

Time per request: 0.15 [ms] (mean)

 

Time per request: 0.15 [ms] (mean, across all concurrent requests)

 

Transfer rate: 1763.36 [Kbytes/sec] received

 

 

有用的统计信息包括每秒的请求数和完成所有测试的总时间。对于前者,值越大越好;对于后者,值越小越好。

现在,在 php.ini 文件中禁用 XCache,然后再一次运行性能检测,如清单 8 所示。可以注释掉对 XCache 扩展的引用,或者关闭所有的 XCache 特性。再次运行性能检测之前,需重启 Apache。

 

清单 8. 禁用 XCache 时的 phpMyAdmin 性能检测

 

				

 

$ sudo apachectl restart

 

$ ab -n 100000 http://localhost/phpmyadmin

 

Concurrency Level: 1

 

Time taken for tests: 17.771 seconds

 

Complete requests: 100000

 

Failed requests: 98256

 

(Connect: 49128, Length: 49128, Exceptions: 0)

 

Broken pipe errors: 0

 

Non-2xx responses: 50872

 

Total transferred: 25741232 bytes

 

HTML transferred: 12005792 bytes

 

Requests per second: 5627.15 [#/sec] (mean)

 

Time per request: 0.18 [ms] (mean)

 

Time per request: 0.18 [ms] (mean, across all concurrent requests)

 

Transfer rate: 1448.50 [Kbytes/sec] received

 

 

此处,XCache 禁用之后,每秒的请求数有所下降,表示 Apache 服务器处理每个请求需更长的时间。运行整套测试所需的时间也因此增加了。

尽 管这只是一个简单的性能检测 —— phpMyAdmin 连接数据库的功能被禁用了,这样能限制单独解释 PHP 的处理时间 —— 并且不是非常科学,但它确实向我们演示了使用 XCache 能够完成哪些任务。对于微小的投入(欣慰地是,PHP 或 Apache 不需重编译),XCache 能产生一个相对较大的回报。代码越复杂,可能的受益也越大。

若想了解 XCache 是如何有效地运行的,请访问 http://localhost/xadmin 并单击 List PHP。您能看到缓存中的 PHP 文件列表,连同 cache hit、操作码的代码大小、源文件的字节大小,等等。图 3 显示了 XCache 专门为 XAMPP 栈包构建时的结果。

 

图 3. XCache 管理页面反映了缓存的状态和内容

 

XCache 管理页面反映了缓存的状态和内容

 

 

前 面已经提及,XCache 是许多加速器中的一种。在强大的 Zend 软件中还有许多免费的开源替代方案和一个商业化产品可选。每种 PHP 加速器都有自己的系统需求,所以应主要根据现有的或预期的配置以及应用程序的特性选择合适的加速器。从中推荐一种很难,但是安装编译器缓存是我建议您务必 要做的。

大量的调优选择

除了缓存之外,还有许多其他途径可以加速应用程序。可以通过删除 PHP 引擎的一些很深奥的特性来简化它。例如,若不需使用 TCP/IP V6 (IPv6) 网络,便可在构建 PHP 时禁用该属性。通过在 PHP 源代码树的顶部输入 ./configure --help 可以参阅 PHP 配置选项的完整列表。无论选择哪一个配置选项,都应该将:

--enable-inline-optimization --disable-debug

 

 

添加到最终的配置命令。前一选项使 PHP 有可能更快地执行(不需使用类似 Zend Engine 的软件进行额外的操作码优化);后一选项取消了 PHP 的调试模式,只有当需要解决 PHP 应用服务器本身的问题时才需开启该模式。

当然,正如一些 C 应用程序,我们能利用 C 编译器构建更佳的可执行程序。如果把 PHP 作为 Linux 或 FreeBSD 上的 Apache Dynamic Shared Object (DSO) 在 x86 处理器上运行,需考虑在 CFLAGS(存储 C 编译器选项的环境变量)中添加 -prefer-non-pic 选项。non-pic 会使用位置独立的代码构建 PHP 并能提供 10% 的性能提升。还可以使用 CFLAGS 中的 -march 确定处理器的类型,例如 -march=opteron 表示处理器类型为 AMD Opteron。

提升速度的另一个途径是操作码优化。此处,Zend Engine 之类的软件会优化编译过程中产生的操作码,这理论上会减少代码执行的工作总量。

缓存和优化都是透明的,并不需额外的编程。要应用一些优化操作,执行结构分析,或检查代码在哪花费了时间。重复的工作既不经济又运算缓慢,这显然会产生瓶颈。通过代码优化弥补周期的不足是很有价值的 —— 但是在结构分析之前不要尝试进行任何优化。

 

展望未来

 

在 接下来的几个月我将再次讨论优化,会谈及调试、快速正文搜索、交替 Web 服务器等内容。同时,还将研究一个或多个 PHP 加速器和操作码优化器。实现 10% 到 200% 的性能提升只需几个小时的优化和修补。想像一下您的机器利用这些空闲的周期能做多少事情吧!

参考资料

学习

 

 
目录
相关文章
|
PHP
为 PHP 应用提速、提速、再提速(共三部分)
http://www.ibm.com/developerworks/cn/opensource/os-php-fastapps1/ http://www.
626 0
|
PHP
为 PHP 应用提速、提速、再提速!
http://www.ibm.com/developerworks/cn/opensource/os-php-fastapps2/  ...
593 0
|
2月前
|
安全 关系型数据库 MySQL
PHP与MySQL交互:从入门到实践
【9月更文挑战第20天】在数字时代的浪潮中,掌握PHP与MySQL的互动成为了开发动态网站和应用程序的关键。本文将通过简明的语言和实例,引导你理解PHP如何与MySQL数据库进行对话,开启你的编程之旅。我们将从连接数据库开始,逐步深入到执行查询、处理结果,以及应对常见的挑战。无论你是初学者还是希望提升技能的开发者,这篇文章都将为你提供实用的知识和技巧。让我们一起探索PHP与MySQL交互的世界,解锁数据的力量!
|
2月前
|
NoSQL 关系型数据库 MySQL
不是 PHP 不行了,而是 MySQL 数据库扛不住啊
【9月更文挑战第8天】这段内容讨论了MySQL在某些场景下面临的挑战及其原因,并指出这些问题不能完全归咎于MySQL本身。高并发读写压力、数据量增长以及复杂查询和事务处理都可能导致性能瓶颈。然而,应用程序设计不合理、系统架构不佳以及其他数据库选择和优化策略不足也是重要因素。综合考虑这些方面才能有效解决性能问题,而MySQL通过不断改进和优化,仍然是许多应用场景中的可靠选择。
134 9
|
3月前
|
存储 SQL 关系型数据库
PHP与MySQL交互的奥秘
【8月更文挑战第29天】在编程的世界里,PHP和MySQL就像是一对默契的舞伴,共同演绎着数据的交响曲。本文将带你探索它们之间的互动,从连接数据库到执行查询,再到处理结果,每一步都充满了节奏与和谐。我们将一起走进这段代码的旅程,感受数据流动的魅力。
|
6天前
|
SQL 关系型数据库 MySQL
12 PHP配置数据库MySQL
路老师分享了PHP操作MySQL数据库的方法,包括安装并连接MySQL服务器、选择数据库、执行SQL语句(如插入、更新、删除和查询),以及将结果集返回到数组。通过具体示例代码,详细介绍了每一步的操作流程,帮助读者快速入门PHP与MySQL的交互。
19 1
|
11天前
|
存储 关系型数据库 MySQL
PHP与MySQL动态网站开发深度解析####
本文作为技术性文章,深入探讨了PHP与MySQL结合在动态网站开发中的应用实践,从环境搭建到具体案例实现,旨在为开发者提供一套详尽的实战指南。不同于常规摘要仅概述内容,本文将以“手把手”的教学方式,引导读者逐步构建一个功能完备的动态网站,涵盖前端用户界面设计、后端逻辑处理及数据库高效管理等关键环节,确保读者能够全面掌握PHP与MySQL在动态网站开发中的精髓。 ####
|
12天前
|
关系型数据库 MySQL PHP
PHP与MySQL动态网站开发实战指南####
本文深入探讨了PHP与MySQL在动态网站开发中的应用实践,通过具体案例解析如何高效结合这两大技术构建数据驱动的Web应用。文章将涵盖环境搭建、基础语法回顾、数据库设计与操作、用户注册与登录系统实现等关键步骤,旨在为开发者提供一个从零到一的项目实战路径,展示PHP与MySQL协同工作的强大能力。 ####
|
1月前
|
SQL 关系型数据库 MySQL
PHP与MySQL协同工作的艺术:开发高效动态网站
在这个后端技术迅速迭代的时代,PHP和MySQL的组合仍然是创建动态网站和应用的主流选择之一。本文将带领读者深入理解PHP后端逻辑与MySQL数据库之间的协同工作方式,包括数据的检索、插入、更新和删除操作。文章将通过一系列实用的示例和最佳实践,揭示如何充分利用这两种技术的优势,构建高效、安全且易于维护的动态网站。
|
3月前
|
SQL 关系型数据库 MySQL
PHP与MySQL交互之基础教程
【8月更文挑战第31天】 在数字世界中,数据是推动一切的核心力量。本文将引导你探索PHP与MySQL的协同工作,通过实际代码示例,展示如何建立连接、执行查询以及处理结果集。无论你是初学者还是希望巩固知识的开发者,这篇文章都将为你提供宝贵的实践知识。