简介
OPcache的前身是Optimizer+(于2013年3月中旬更名为Opcache),Zend开发的一款闭源但可以免费使用的PHP优化加速组件。OPcache通过将PHP脚本预编译的字节码存储到共享内存中来提升PHP的性能,存储预编译字节码的好处就是 省去了每次加载和解析 PHP 脚本的开销。
PHP 5.5.0及后续版本中已经绑定了OPcache扩展。对于PHP 5.2,5.3 和 5.4 版本可以使用PECL扩展中的OPcache库
常用的配置
opcache.revalidate_freq
设置缓存的过期时间(单位是秒),当这个时间达到后,opcache会检查你的代码是否改变,如果改变了PHP会重新编译它,生成新的opcode,并且更新缓存。为“0”表示每次请求都会检查PHP代码是否更新
opcache.validate_timestamps
如果启用(设置为1),那么OPcache会每隔opcache.revalidate_freq设定的秒数检查脚本(文件的时间戳)是否更新
如果禁用(设置为0),opcache.revalidate_freq被忽略,PHP文件永远不会被检查。这意味着如果修改了你的代码,然后更新到服务器上,再在浏览器上请求更新的代码对应的功能,会看不到更新的效果,必须得重新加载(重启apache或者nginx等)
opcache.max_accelerated_files
设置内存中最多可以缓存多少个PHP文件。这个选项必须得设置得足够大,大于你的项目中的所有PHP文件的总和。真实的取值是在质数集合{ 223, 463, 983, 1979, 3907, 7963, 16229, 32531, 65407, 130987 } 中找到的第一个大于等于设置值的质数。 设置值取值范围最小值是 200,最大值在 PHP 5.5.6 之前是 100000,PHP 5.5.6 及之后是 1000000
可以运行“find . -type f -print | grep php | wc -l”这个命令来快速计算你的代码库中的PHP文件数
opcache.memory_consumption
OPcache共享内存存储大小。用于存储预编译的opcode(以MB为单位),通过调用opcache_get_status()来获取opcache使用的内存总量,可据此进行相应的调整
opcache.interned_strings_buffer
用来存储驻留字符串的内存量(单位是MB),这个选项则会把这个特性提升一个层次——默认情况下这个不可变的内存区域只会存在于单个php-fpm的进程中,如果设置了这个选项,那么它将会在所有的php-fpm进程中共享。在比较大的应用中,这可以非常有效地节约内存,提高应用的性能。
什么是驻留字符串呢?PHP解释器在背后会找到相同字符串的多个实例,把这个字符串保存在内存中,如果再次使用相同的字符串,PHP解释器会使用指针,这么做的目的是节省内存。默认情况下,PHP驻留字符串会隔离在各个PHP进程中,这个设置能让PHP-FPM进程池把所有进程驻留字符串存储到共享的缓冲区中,以便在PHP-FPM进程池中的多个进程之间引用驻留字符串,这样能节省更多内存。
例如,如果你在代码中使用了100次字符串“basketball”,在PHP内部只会在第一使用这个字符串的时候分配一个不可变的内存区域来存储这个字符串,其他的99次使用都会直接指向这个内存区域。
opcache.fast_shutdown
若启用,则会使用快速停止续发事件。 所谓快速停止续发事件是指依赖 Zend 引擎的内存管理模块 一次释放全部请求变量的内存,而不是依次释放每一个已分配的内存块。
该指令已在PHP 7.2.0中被删除。快速关机序列的一个变种已经被集成到PHP中,并且如果可能的话将被自动使用
opcache在php.ini的设置如下:
[opcache]
zend_extension=/path/opcache.so
opcache.revalidate_freq=10
opcache.validate_timestamps=1
opcache.max_accelerated_files=7963
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.fast_shutdown=1
opcache相关的几个函数
opcache_compile_file — 无需运行,即可编译并缓存PHP脚本
opcache_get_configuration — 获取php.ini中的配置信息
opcache_get_status — 获取缓存的状态信息
opcache_invalidate — 废除脚本缓存
opcache_is_script_cached — 一个php文件是否被缓存
opcache_reset — 重置情况所有的缓存内容
参考资料