公告:

PHP Opcode 缓存之APC 安装配置 | William Sang

作者:star0312 / 时间:9年前 (2016/04/21) / 分类:未命名 / 阅读:1900 / 评论:0

》》本文主要内容

  • 什么是PHP的Opcode?
  • 为什么要使用Opcode缓存?
  • Opcode缓存工具---APC的安装、配置、测试、管理

什么是PHP的Opcode?

Opcode是一种PHP脚本编译后的中间语言,就像Java的ByteCode,或者.NET的MSL。如果想详细了解可以参考: 深入理解PHP原理之Opcodes

为什么要使用Opcode缓存?

这得从PHP代码的生命周期说起,请求PHP脚本时,会经过五个步骤,如下图所示:

PHP Opcode 缓存之APC 安装配置 | William Sang

Zend引擎必须从文件系统读取文件、扫描其词典和表达式、解析文件、创建要执行的计算机代码(称为Opcode),最后执行Opcode。每一次请求PHP脚本都会执行一遍以上步骤,如果PHP源代码没有变化,那么Opcode也不会变化,显然没有必要每次都重行生成Opcode,结合在Web中无所不在的缓存机制,我们可以把Opcode缓存下来,以后直接访问缓存的Opcode岂不是更快,启用Opcode缓存之后的流程图如下所示:

PHP Opcode 缓存之APC 安装配置 | William Sang

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%。

并发量200300
With APC684.79 [#/sec] (mean)757.32 [#/sec] (mean)
Without APC376.28 [#/sec] (mean)362.28 [#/sec] (mean)

APC管理

在APC源文件中有一个名为apc.php的文件,把它复制到web服务器目录下,就可以参看当前APC缓存的工作状况,而且还有直观的图表展示内存使用情况,可以据此设置共享内存大小。对于用户变量缓存需要输入密码,密码直接设定在apc.php文件中,不要忘记修改密码哦。

PHP Opcode 缓存之APC 安装配置 | William Sang

总结:

由上文可见,Opcode缓存可以极大地提高应用的吞吐量,在实际生产环境中基本就是标配。PHP 5.5的首个测试版中,官方首次将Zend OPCache(即Zend Optimizer+)纳入其中。可以期待的是以后也许都不需要额外安装Opcode缓存插件了。

  • 我的QQ二维码
  • QQ群
  • 我的微信二维码
  • 微信公众号

没有评论,留下你的印记,证明你来过。


发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。