什么是Opcache
鸟哥在博客中说,提高PHP 7性能的几个tips,第一条就是开启opcache:
记得启用Zend Opcache, 因为PHP7即使不启用Opcache速度也比PHP-5.6启用了Opcache快,
所以之前测试时期就发生了有人一直没有启用Opcache的事情
那么什么是Opcache呢?
Opcache 的前生是 Optimizer+
,它是PHP的官方公司 Zend 开发的一款闭源但可以免费使用的 PHP 优化加速组件。 Optimizer+ 将PHP代码预编译生成的脚本文件 Opcode
缓存在共享内存中供以后反复使用,从而避免了从磁盘读取代码再次编译的时间消耗。同时,它还应用了一些代码优化模式,使得代码执行更快。从而加速PHP的执行。
PHP的正常执行流程如下
request请求(nginx,apache,cli等)–>Zend引擎读取.php文件–>扫描其词典和表达式 –>解析文件–>创建要执行的计算机代码(称为Opcode)–>最后执行Opcode–> response 返回
每一次请求PHP脚本都会执行一遍以上步骤,如果PHP源代码没有变化,那么Opcode也不会变化,显然没有必要每次都重新生成Opcode,结合在Web中无所不在的缓存机制,我们可以把Opcode缓存下来,以后直接访问缓存的Opcode岂不是更快,启用Opcode缓存之后的流程图如下所示:
Opcode cache 的目地是避免重复编译,减少 CPU 和内存开销。
安装OPcache
OPcache开启需要有opcache.so
这个文件,它的位置:
win:(php根目录)ext/php_opcache.dll
Linux:/usr/local/lib/php/extensions/no-debug-non-zts-xxxxx/opcache.so
在PHP 5.5.0及后续版本中,PHP已经将Opcache功能以拓展库形式内嵌在发布版本中了,默认未开启Opcache加速,需要开发人员在php.ini中添加或解注释Opcache相关配置即可。对于之前的老版本,可以将Opcache作为PECL拓展库进行安装和配置,可以参考PHP拓展安装及配置:
如果PHP是编译安装的,需要在编译参数加上--enable-opcache
选项来开启 OPcache。
PHP版本>=5.5
可以使用OPcache,<=5.4
使用不了OPcache,使用的是APC作为代码缓存。
配置OPcache
在php.ini
写入如下配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
[opcache] # opcache.so的位置,Linux直接写模块名,Windows则需要写全路径 zend_extension=opcache.so # 开启opcache opcache.enable=1 # CLI环境下,PHP启用OPcache opcache.enable_cli=1 # OPcache共享内存存储大小,单位MB opcache.memory_consumption=128 # PHP使用了一种叫做字符串驻留(string interning)的技术来改善性能。 # 例如,如果你在代码中使用了1000次字符串“foobar”,在PHP内部只会在第一使用这个字符串的时候分配一个不可变的内存区域来存储这个字符串,其他的999次使用都会直接指向这个内存区域。这个选项则会把这个特性提升一个层次——默认情况下这个不可变的内存区域只会存在于单个php-fpm的进程中,如果设置了这个选项,那么它将会在所有的php-fpm进程中共享。在比较大的应用中,这可以非常有效地节约内存,提高应用的性能。 # 这个选项的值是以兆字节(megabytes)作为单位,如果把它设置为16,则表示16MB,默认是4MB opcache.interned_strings_buffer=8 # 这个选项用于控制内存中最多可以缓存多少个PHP文件。 # 这个选项必须得设置得足够大,大于你的项目中的所有PHP文件的总和。 # 设置值取值范围最小值是 200,最大值在 PHP 5.5.6 之前是 100000,PHP 5.5.6 及之后是 1000000。也就是说在200到1000000之间。 opcache.max_accelerated_files=4000 # 设置缓存的过期时间(单位是秒),为0的话每次都要检查 opcache.revalidate_freq=60 # 从字面上理解就是“允许更快速关闭”。它的作用是在单个请求结束时提供一种更快速的机制来调用代码中的析构器,从而加快PHP的响应速度和PHP进程资源的回收速度,这样应用程序可以更快速地响应下一个请求。把它设置为1就可以使用这个机制了。 opcache.fast_shutdown=1 # 如果启用(设置为1),OPcache会在opcache.revalidate_freq设置的秒数去检测文件的时间戳(timestamp)检查脚本是否更新。 # 如果这个选项被禁用(设置为0),opcache.revalidate_freq会被忽略,PHP文件永远不会被检查。这意味着如果你修改了你的代码,然后你把它更新到服务器上,再在浏览器上请求更新的代码对应的功能,你会看不到更新的效果 # 强烈建议你在生产环境中设置为0,更新代码后,再平滑重启PHP和web服务器。 opcache.validate_timestamps=0 # 开启Opcache File Cache(实验性), 通过开启这个, 我们可以让Opcache把opcode缓存缓存到外部文件中, 对于一些脚本, 会有很明显的性能提升. # 这样PHP就会在/tmp目录下Cache一些Opcode的二进制导出文件, 可以跨PHP生命周期存在. opcache.file_cache=/tmp |
docker php如何开启opcache并配置
1 2 3 4 5 6 |
# 进入php容器,php74是容器名称 docker exec -it php74 /bin/bash # 开启opcache # 在php容器里执行如下命令 docker-php-ext-enable opcache |
就会在(docker 容器里的路径)/usr/local/etc/php/conf.d/docker-php-ext-opcache.ini
生成opcache配置文件,把opcache的配置写在docker-php-ext-opcache.ini
这个文件里并保存,重启docker即可生效。
phpinfo
opcache的配置说明
https://www.php.net/manual/zh/opcache.configuration.php
注意事项
1、不建议Xcache和Opcache同时启用PHP优化;
因为PHP 5.5.0及后续版本已经内嵌对Opcache的支持,所以PHP意识到其重要性,相对于Xcache等第三方的PHP优化器来说,使用Opcache会是更好的选择。另外,两者同时存在的话,会使Opcache的缓存命中数大大降低,而且增加不必要的开销。
2、不建议在开发过程中开启Opcache
原因很明显,开启了Opcache之后,开发人员修改的内容不会立即显示和生效,因为受到opcache.revalidate_freq=60的影响,所以建议在开发并测试之后,测试性能时再行打开测试,当然,生产环境一直都要开着Opcache了哦。
3、不建议将Opcache指标设置太大
Opcache各项指标配置大小或是否开启,需要结合项目实际情况需求及Opcache官方建议的配置,项目的实际情况分析,可结合上面第四部分的可视化缓存信息分析调整。
4、不建议长期使用老版本的Opcache
建议及时关注Opcache官网动态,实时了解其的bugs修复,功能优化及新增功能,以便更好的将其应用在自己的项目中。
5、不建议在生产环境中,将上面介绍的开源项目放入Web服务根目录
原因很简单,因为这个开源项目并未做访问的限制和安全处理,也就是说凡是可以访问外网的用户,只要知道了访问地址就可以直接访问,所以不安全。一般下,这个开源工具只是帮助可视化分析PHP的性能,通常在开发调试阶段使用。如果就是想在生产环境开启使用,那么就必须做好安全限制工作。