》》本文主要内容
- 什么是PHP的Opcode?
- 为什么要使用Opcode缓存?
- Opcode缓存工具---APC的安装、配置、测试、管理
什么是PHP的Opcode?
Opcode是一种PHP脚本编译后的中间语言,就像Java的ByteCode,或者.NET的MSL。如果想详细了解可以参考: 深入理解PHP原理之Opcodes
为什么要使用Opcode缓存?
这得从PHP代码的生命周期说起,请求PHP脚本时,会经过五个步骤,如下图所示:
Zend引擎必须从文件系统读取文件、扫描其词典和表达式、解析文件、创建要执行的计算机代码(称为Opcode),最后执行Opcode。每一次请求PHP脚本都会执行一遍以上步骤,如果PHP源代码没有变化,那么Opcode也不会变化,显然没有必要每次都重行生成Opcode,结合在Web中无所不在的缓存机制,我们可以把Opcode缓存下来,以后直接访问缓存的Opcode岂不是更快,启用Opcode缓存之后的流程图如下所示:
Opcode缓存工具---APC
如何缓存Opcode呢?哈哈,已经有不少大神写好了这些工具,以PHP扩展的形式发布。关于Opcode的缓存工具有不少,常用的有Alternative PHP Cache(APC), Zend Optimizer+(官方插件,以开源),XCache和eAccelerator(eA)。我们在这里选择APC作为我们的缓存工具。APC还可以当作类似Memcached缓存在本地使用,这里就不介绍了,有兴趣的可以看看PHP手册,里面有相关函数可以使用。
APC的安装
下载,解压(本次采用APC-3.1.13),进入源代码目录
1 2 3 | $ /usr/local/server/php/bin/phpize $ . /configure -- enable -apc -- enable -apc-spinlocks --with-php-config= /usr/local/server/php/bin/php-config $ make && make install |
备注:这里--enable-apc-spinlocks启用了自旋锁,默认是pthreadmutex多线程锁。据说是Facebook推荐的,关于锁策略可以参考这篇文章:Pthreads mutex vs Pthreads spinlock
APC的配置
然后在php.ini中添加以下配置:
1 2 3 4 5 6 7 8 9 10 11 12 | extension=apc.so [apc] apc.enabled=1 apc.shm_segments=1 apc.shm_size=30M apc.ttl=7200 apc.user_ttl=3600 apc.stat =1 apc.stat_ctime = 0 apc.max_file_size = 1M |
apc.so 前面最好带有编译PHP后产生的全路径,我这里为显示方便省略了
对参数的解释:
APC默认的配置都已经够好了,对于不清楚的配置选项不要轻易配置
只有两个配置需要重点关注:
- 一是分配内存大小:apc.shm_size
- 二是是否启用脚本更新检查:apc.stat
;是否启用APC
apc.enabled=1
;共享内存数目,默认APC启用了mmap,设置大于1的值会报错
apc.shm_segments=1
;共享内存大小,单位可以为M和G,必须要写单位
apc.shm_size=30M
;系统缓存对象生命周期,time to live,即指定时间后缓存对象会被清除
;设为 0 意味着缓冲区有可能被旧的缓存条目填满,从而导致无法缓存新条目
;如果大于0,APC将尝试删除过期条目。单位:秒
apc.ttl=7200
;用户缓存对象生命周期
apc.user_ttl=3600
;是否启用脚本更新检查。如果为0,则修改代码后需要重启服务器
apc.stat =1
;验证ctime(创建时间)可以避免SVN或者rsync带来的问题,确保自上次统计inode没有改变。APC通常只检查mtime(修改时间)。
apc.stat_ctime = 0
;最大缓存文件大小,默认为1M
apc.max_file_size=1M
更加详细的参数参考官方文档
APC测试
我使用ab简单测试了同一个PHP脚本在安装APC前和安装后
在相同并发量的情况下吞吐量,吞吐量基本增加了100%。
并发量 | 200 | 300 |
With APC | 684.79 [#/sec] (mean) | 757.32 [#/sec] (mean) |
Without APC | 376.28 [#/sec] (mean) | 362.28 [#/sec] (mean) |
APC管理
在APC源文件中有一个名为apc.php的文件,把它复制到web服务器目录下,就可以参看当前APC缓存的工作状况,而且还有直观的图表展示内存使用情况,可以据此设置共享内存大小。对于用户变量缓存需要输入密码,密码直接设定在apc.php文件中,不要忘记修改密码哦。
总结:
由上文可见,Opcode缓存可以极大地提高应用的吞吐量,在实际生产环境中基本就是标配。PHP 5.5的首个测试版中,官方首次将Zend OPCache(即Zend Optimizer+)纳入其中。可以期待的是以后也许都不需要额外安装Opcode缓存插件了。
没有评论,留下你的印记,证明你来过。
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。