鸟哥在博客中说,提高PHP 7性能的几个tips,第一条就是开启opcache:
记得启用Zend Opcache, 因为PHP7即使不启用Opcache速度也比PHP-5.6启用了Opcache快, 所以之前测试时期就发生了有人一直没有启用Opcache的事情。
背景
最近业务有所增长,随之而来的是慢请求逐渐多了起来,在搜索php性能优化的过程中发现了opcache,相关的文章很多,但是都比较零碎,所以在此做个总结。公司当前使用的PHP版本为php7.x.x。
opcache是什么?
Opcache 的前生是 Optimizer+
,它是PHP的官方公司 Zend 开发的一款闭源但可以免费使用的 PHP 优化加速组件。
官网介绍:
OPcache 通过将 PHP 脚本预编译的字节码存储到共享内存中来提升 PHP 的性能, 存储预编译字节码的好处就是 省去了每次加载和解析 PHP 脚本的开销。
PHP 5.5.0 及后续版本中已经绑定了 OPcache 扩展。 对于 PHP 5.2,5.3 和 5.4 版本可以使用 » PECL 扩展中的 OPcache 库。
PHP的正常执行流程如下:
request请求(nginx,apache,cli等)–>Zend引擎读取.php文件–>扫描其词典和表达式 –>解析文件–>创建要执行的计算机代码(称为Opcode)–>最后执行Opcode–> response 返回。
如上图,启用opcache之前,每一次请求PHP脚本都会执行一遍以上步骤,如果PHP源代码没有变化,那么Opcode也不会变化,显然没有必要每次都重新生成Opcode,结合在Web中无所不在的缓存机制,我们可以把Opcode缓存下来,以后直接访问缓存的Opcode岂不是更快。
启用Opcode缓存之后的流程图如下所示:
Opcode cache 的目地是避免重复编译,减少 CPU 和内存开销。
如何使用opcache?
载入opcache扩展
PHP 5.5及后续版本默认都绑定了opcache扩展,所以我在此就不需要再编译安装扩展了,可以直接编辑 php.ini 文件配置载入 opcache 扩展。
载入方法,在php.ini文件加入:
然后重启,php-fpm服务,通过命令可查看PHP当前支持的扩展:
启用opcache
至此PHP已加载opcache模块,然后就需要进行修改 php.ini 配置,启用 opcache (以下是官方推荐配置,仅供参考):
重启php-fpm服务后生效。
关于Linux内核HugePage
在opcache配置中有这样一个参数:huge_code_pages=1
,该参数需要配合系统HugePage参数共同使用。
关于Hugepage详细介绍可参考:Linux HugePage 特性
在系统中开启Hugepage:
优化效果
未使用opcache:
使用opcache:
很显然,使用opcache后效果还是很明显的,请求处理明显快了很多!
opcache参数详解
更多配置参数见:运行时配置
opcache管理——cachetool
相对于启用opcache,日常运维人员更关心的是如何对其进行管理。
CacheTool通过CLI管理和查看(当然,你还可以通过phpinfo来查看)APCu、opcache、file-cache的状态。
下载即用:cachetool
示例:
CacheTool | PHP |
---|---|
9.x | >=8.1 |
8.x | >=8.0 |
7.x | >=7.3 |
6.x | >=7.3 |
5.x | >=7.2 |
4.x | >=7.1 |
3.x | >=5.5.9 |
2.x | >=5.5.9 |
1.x | >=5.3.3 |
如果php-fpm限制了监听地址,需要在 --fcgi
中指定,如 --fcgi=192.168.1.110:9000
(同php-fpm.conf的listen配置),可以通过 netstat -lntp |grep php-fpm
查看。