OPCache 提升 PHP 性能:配置参考
PHP 对于解释型语言,每次运行时都会加载并分析所有代码。一方面的好处是代码可以随时更新和修改,因为我们不需要编译。但这也会带来一个问题,即无法处理过多的流量。毕竟每次加载、解析、释放都会增加CPU的负载。通常,8核16G服务器在2000或3000个并发操作时,CPU利用率可以达到60%以上。而如果你使用的是Laravel这样的大型框架,效率会更低。目前,我们通常会增加负载均衡器的数量来减轻服务器的压力。然而,这样做的成本将显着增加。那么有没有什么优化方案呢?
鸟哥博客上的PHP7优化文章中,第一个建议是启用OPcache。当然还有一个选择就是使用Swoole。我们以后再聊Swoola。今天我们先学习OPcache。
什么是 OPcache
OPcache 通过将 PHP 脚本的预编译字节码存储在共享内存中来提高 PHP 性能。存储预编译字节码的好处是,无需每次都加载和分析 PHP 脚本。与成本。
这是PHP文档中对OPcache的介绍。也就是说,OPcache保存了每次的加载和解析步骤,并将第一次解析和编译后的脚本字节码存储在系统的共享内存中。其实类似于不完整的编译。
像Java这样的语言必须要打包编译后才能在线运行,比如打包成jar包。 C++ 或 C# 可以封装在 .dll 或 .exe 中。这些打包的文件是编译后的文件。一旦启动,它们通常会保持运行状态,也就是说,它们成为常驻进程,并且它们的代码进入内存。程序运行的时候,不需要解释,也不需要编译,速度自然就快很多。 OPcache也扮演着类似的角色。然而,这并不是一个完整的编译过程。我们仍然依赖 PHP-FPM 来运行脚本。然而,当OPcache开启时,PHP-FPM首先会扫描内存,看看缓存中是否已经存在相关的字节码。如果在内存中,则直接访问。如果没有,它将被重新解释、编译和缓存。另外,OPcache是针对文件的,这意味着如果新添加了一个文件,只有在运行时才会对其进行缓存。如果还没有启动,则不在当前共享内存中。
安装Opcache
OPcache已经是官方的PHP扩展,并以安装包形式发布。因此,我们可以在编译安装PHP时使用--enable-opcache来启用该扩展。它已经是默认扩展名。您还可以使用安装包中的文件在未安装OPcache的系统上安装OPcache。
cd php-7.4.4/ext/opcache/
phpize
./configure
make && make install
需要注意的是,OPcache和Xdebug不应该在生产环境中一起使用。 Xdebug本身不建议在生产环境中使用。如果必须同时使用,则需要先加载OPcache,再加载Xdebug。
安装扩展后,在 php.ini 文件中打开扩展。需要注意的是,OPcache扩展是Zend扩展包,所以我们需要打开Zend扩展。
zend_extension=opcache.so
您还需要启用它。
opcache.enable=1
当OPcache开启后,我们更新代码时,发现我们刚刚更新的代码不是我们最新的代码。这是因为代码已经被缓存了,就像Java一样,我们需要重新启动服务。那么什么是PHP中的重启呢?当然,重启我们的PHP-FPM就可以了。只需使用kill -USR2命令重新启动主进程即可。此处还列出了快速重启命令。
ps -ef | grep "php-fpm: master" | grep -v grep | cut -c 9-15 | xargs kill -USR2
感谢知乎大佬的指正。重新启动 PHP-FPM 并不是最好的解决方案。对于手动重启,您应该使用 opcache_reset() 或配置 php.ini
opcache.validate_timestamps + opcache.revalidate_freq 以一定的时间间隔自动编译。或者直接使用opcache_compile_file()重新编译修改后的文件
ab测试效果
我们测试的内容是测试环境中的2核4G服务器。使用的PHP版本是PHP7.4,正常。 Nginx 和 PHP 配置中,ulimit 也设置为最大值。该代码只是输出一行文本,但我们使用的是一个简单的 mvc 框架,这意味着当该代码运行时,它至少加载几个文件而不是一个文件。
首先我们看一下没有启用OPcache的情况。
下一步是启用 OPcache。
当然,性能提升了很多。不仅速度提高了很多,吞吐量也增加了数倍。当然,这只是一个非常简单的测试,但总体来说对于提高一台机器的性能有很大帮助。最重要的是,相同并发情况下,CPU资源比不开启时低70%。
配置参考
在PHP官方文档中,我们在php.ini中得到了一套OPcache默认配置。经过测试基本没有问题。当然,目前还没有在生产环境中使用,还需要进一步测试。不过文档指出,这套配置可以直接在线使用,但需要注意的是,一些使用注解等功能的高级框架将需要注意某些参数。
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
opcache.enable_cli=1
具体配置说明和其他配置选项请参考官方文档了解详细信息。
总结
既然是我们PHP大师鸟哥推荐的,而且也是官方推荐的扩展,所以我想在正式的生产环境中使用不会有太大问题。另外,官方还提供了一套可以直接应用于线上生产环境的配置参数,这也让我们更方便的直接在线进行测试。目前,我们在生产环境中只使用一台服务器进行测试,并为其分配更多的负载。从目前的情况来看,这台机器的运行效率比其他机器要高很多。因为一方面它处理的请求较多,另一方面它的CPU资源占用率没有其他几台机器高。同时OPcache不需要我们更多地了解进程协程,不像Swoole那样会带来更高的学习成本。综上所述,经过充分测试,OPcache绝对是我们优先考虑的单机优化方案。
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。