当前位置: 首页 > 后端技术 > PHP

使用OPCache提高PHP的性能

时间:2023-03-29 18:01:36 PHP

对于PHP这样的解释型语言,每次运行时都会加载并解析所有代码。这样做的好处是可以随时更新和修改代码,因为我们不需要编译。但是这样也会带来一个问题,就是承载不了太多的流量。毕竟每次加载、分析和释放都会增加CPU的负担。通常一个8核16G的服务器在2、3000并发时可以达到60%以上的CPU占用率。而如果你使用的是像Laravel这样的大型框架,效率会更低。这时候我们通常会通过增加服务器的数量来做负载均衡,以减轻服务器的压力。但是,这样做的成本会增加很多。那么,有什么优化方案吗?鸟哥在其博客的一篇关于PHP7优化的文章中,第一个建议是开启OPcache。当然还有一个方案就是使用Swoole。关于Swoole的内容我们以后再说。今天,我们先来了解一下OPcache。什么是OP缓存?OPcache通过将PHP脚本的预编译字节码存储在共享内存中来提高PHP的性能。存储预编译字节码的好处是可以节省每次加载和解析PHP脚本的开销。这是PHP文档中对OPcache的介绍,也就是说OPcache保存了加载和解析的每一步,将第一次解析编译后的脚本字节码缓存到系统的共享内存中。实际上,这类似于不完整的编译。像Java这样的语言必须要打包编译才能上线运行,比如打包成jar包。C++或C#可以打包成.dll或.exe。这些打包文件是编译后的文件。它们运行后,一般会一直运行下去,也就是成为常驻进程,它们的代码会进入内存。程序运行时,不需要解释编译,自然速度就快多了。而OPcache也起着类似的作用。只是它不是一个完整的编译过程。我们仍然依赖PHP-FPM来运行脚本,但是在启用OPcache之后,PHP-FPM会先检查内存中是否有相关的缓存字节码。它在内存中,有则直接使用,没有则重新解释编译然后缓存。另外,OPcache是??针对文件的,也就是说,如果新添加了一个文件,只有运行过后才会缓存。如果没有运行过,则不在当前共享内存中。安装OpcacheOPcache已经是PHP的官方扩展,随安装包一起发布,所以我们在编译安装PHP时可以使用--enable-opcache来启用该扩展,它已经是默认的扩展了。您也可以使用安装包中的文件在未安装OPcache的系统上安装它。cdphp-7.4.4/ext/opcache/phpize./configuremake&&makeinstall需要注意的是,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-vgrep|剪切-c9-15|xargskill-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=128opcache.interned_strings_buffer=8opcache.max_accelerated_files=4000opcache.revalidate_freq=60opcache.fast_shutdown=1opcache.enable_cli=1具体配置说明和其他配置选项,我们可以参考官方文档进行详细了解。总结由于是我们PHP高手鸟哥推荐的,也是官方推荐的扩展,所以我觉得在正式的生产环境中使用问题不大。另外,官方还给出了一套可以直接应用于线上生产环境的配置参数,也方便我们直接线上测试。目前在生产环境中,我们只使用一台服务器进行测试,并为其分配更多的负载。从目前的情况来看,这台机器的运行效率要比其他机器高很多。因为它一方面处理的请求比较多,另一方面它的CPU资源占用没有其他机器高。同时OPcache不需要我们去学习更多的进程协程,不像Swoole会带来更高的学习成本。所以综上所述,在完整测试的情况下,OPcache绝对是我们最优先考虑的单机优化方案。参考文档:https://www.laruence.com/2015/12/04/3086.htmlhttps://www.php.net/manual/zh/book.opcache.php===========各媒体平台均可搜索【硬核项目经理】