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

opcache

时间:2023-03-29 15:34:38 PHP

,php系列框架的加速器1.个人实践发现opcache最近要应对双十一期间高流量的影响。小编通过压力测试来寻找服务器性能瓶颈。发现在100并发的时候,QPS不是很高,但是CPU和内存消耗极高,尤其是CPU消耗100%,我们的容器和服务器配置几乎都升级到顶级了。这不是这么好的服务器应该起到的效果,所以小编全面排查:查看接口的数据库查询部分,这部分是缓存的,redis的消耗不是很高,影响性能的因素排除数据库和缓存;检查是否有其他影响性能的外部调用,发现这部分只通过数据库和Cache获取数据,排除;检查接口程序代码中是否有复杂的逻辑计算,发现这部分处理的数据处理后直接缓存。有一段时间,数据来源是redis缓存,所以排除,既然已经上传了,可能会造成接口瓶颈,所以全部排除,所以最有可能是laravel5.0的框架现在使用导致界面性能这么低,然后通过框架文档,源码和网上资料,发现laravel框架在运行时会加载大量的框架文件,然后这些编译文件导致了服务器的CPU消耗特别高。通过这个方向,小编为PHP找到了一个很好的扩展opcache来缓存PHP编译后的文件。2、opcache的原理什么是Opcache?Opcache是一种通过将已解析的PHP脚本的预编译字节码(OperateCode)存储在共享内存中来避免每次加载和解析PHP脚本的开销的方法。解析器可以直接从共享内存中读取缓存的词。段代码(OperateCode),从而大大提高了PHP的执行效率。什么是操作码?解释器解析完脚本代码后,生成可以直接运行的中间代码,也称为操作码(OperateCode,opcode)。Opcode缓存的目的是避免重复编译,减少CPU和内存开销。如果动态内容的性能瓶颈不在CPU和内存,而在I/O操作,比如数据库查询导致的磁盘I/O开销,那么opcodecache对性能的提升是非常有限的。但由于操作码缓存可以减少CPU和内存开销,这总是一件好事。现代操作码缓存(Optimizer+、APC2.0+等)使用共享内存进行存储,并且可以直接从中执行文件,而无需在执行前“反序列化”代码。这将导致显着的性能加速,并且通常会降低整体服务器内存消耗,尤其是在高流量和高并发的情况下,而且几乎没有缺点。为什么要使用Opcode缓存?这要从PHP代码的生命周期说起。当请求一个PHP脚本时,它会经过五个步骤,如下图所示:Zend引擎必须从文件系统中读取文件,扫描它的字典和表达式,解析文件,创建计算机代码(称为Opcode),最后执行Opcode。每次请求PHP脚本时,都会执行上述步骤。如果PHP源代码没有改变,Opcode就不会改变。显然,没有必要每次都重新生成Opcode。结合Web中无处不在的缓存机制,我们可以缓存Opcode,以后直接访问缓存的Opcode岂不是更快?启用Opcode缓存后的流程如下:因此,使用OperateCode缓存后,PHP代码会直接获取opcode并直接执行,中间的三步就省略了。因此会大大提高PHP代码的执行效率3.Opcache的安装与使用安装当你的PHP版本低于7.0时,可以到http://pecl.php.net/package/ZendOpcache下载对应的opcache根据您的PHP版本Version。例如PHP5.5:http://pecl.php.net/get/zendopcache-7.0.5.tgztar-zxvfzendopcache-7.0.5.tgzcdzendopcache-7.0.5phpize./configure--with-php-config=/usr/local/php/bin/php-configmakemakeinstall这样会在php的扩展文件夹下生成opcache.so。PHP7.0以后就不用安装opcache.so了。将zend_extension=opcache.so添加到php.ini中;注意:这里是zend_extension,不是extension。zend_extension和extension的区别可以参考相关资料。配置opcache的详细参数配置。我没有做过太多研究。核心参数如下:opcacheextensionlocationzend_extension=opcache.soenableopcacheopcache.enable=1Usesharedmemorysizeopcache.memory_consumption=200stringcachesizeopcache.interned_strings_buffer=8最大缓存文件数opcache.max_accelerated_files=8000如果一个异常发生,立即释放所有内存opcache.fast_shutdown=1最大允许内存使用百分比,超过此限制将重新启动进程opcache.max_wasted_percentage=20如果设置为1,将当前路径添加到文件键中,以避免可能的文件键冲突相同文件名opcache.use_cwd=1文件检测周期revalidate_freq=3600启用文件缓存时间戳opcache.validate_timestamps=1