在开始之前,首先确保 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 上留出的共享内存总量。要实现这一目的,需创建(或编辑)文件 /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。从 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 文件,使之包含 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
。
设置好 XCache 后,重启 Apache Web 服务器。对于大多数系统,可以以 root 用户的身份使用 apachectl restart
进行重启。
$ sudo apachectl restart /usr/sbin/apachectl restart: httpd restarted |
检验 XCache 是否已启用,需创建一个小型 PHP 程序用于调用 phpinfo()
并在 Web 浏览器中打开那个文件。这样就能看到类似下图的 XCache 版面。
图 1. phpinfo() 方法给出了 XCache 设置
![phpinfo() 方法给出了 XCache 设置](https://i-blog.csdnimg.cn/blog_migrate/915b8027c1053752a7dc93c69a7d47a6.png)
要监控 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 面板](https://i-blog.csdnimg.cn/blog_migrate/c9a9af8647aa1bf0edb00d538632048f.png)
选择一个或两个应用程序进行测试。您可以使用自己的代码或者,如果想要更复杂一点,使用大型的 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 管理页面反映了缓存的状态和内容](https://i-blog.csdnimg.cn/blog_migrate/6b10988ff5f0d19ae8bd570c71defac4.png)
前面已经提及,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 之类的软件会优化编译过程中产生的操作码,这理论上会减少代码执行的工作总量。
缓存和优化都是透明的,并不需额外的编程。要应用一些优化操作,执行结构分析,或检查代码在哪花费了时间。重复的工作既不经济又运算缓慢,这显然会产生瓶颈。通过代码优化弥补周期的不足是很有价值的 —— 但是在结构分析之前不要尝试进行任何优化。
本文转自http://www.ibm.com/developerworks/cn/opensource/os-php-fastapps1/
转载于:https://blog.51cto.com/haibo600/865218