最近开发了一个项目,客户要求压力测试,测试时发现并发量大时php-fpm占用cpu一直100%,调整了php的最大进程数pm.max_children,优化了程序效果不明显。后面使用了opcache,cpu使用率一下降到20%左右。
什么是opcache?下面是百度:
Opcache 的前生是 Optimizer+
,它是PHP的官方公司 Zend 开发的一款闭源但可以免费使用的 PHP 优化加速组件。
官网介绍:
OPcache 通过将 PHP 脚本预编译的字节码存储到共享内存中来提升 PHP 的性能, 存储预编译字节码的好处就是 省去了每次加载和解析 PHP 脚本的开销。
PHP 5.5.0 及后续版本中已经绑定了 OPcache 扩展。 对于 PHP 5.2,5.3 和 5.4 版本可以使用 » PECL 扩展中的 OPcache 库。
PHP的正常执行流程如下:
request请求(nginx,apache,cli等)-->Zend引擎读取.php文件-->扫描其词典和表达式 -->解析文件-->创建要执行的计算机代码(称为Opcode)-->最后执行Opcode--> response 返回。
如上图,启用opcache之前,每一次请求PHP脚本都会执行一遍以上步骤,如果PHP源代码没有变化,那么Opcode也不会变化,显然没有必要每次都重新生成Opcode,结合在Web中无所不在的缓存机制,我们可以把Opcode缓存下来,以后直接访问缓存的Opcode岂不是更快。
启用Opcode缓存之后的流程图如下所示:
Opcode cache 的目地是避免重复编译,减少 CPU 和内存开销。
那要如果配置Opcode?php7.4自带就有,我是在php.ini加上如下配置
zend_extension=opcache.so
opcache.enable=1
opcache.use_cwd=1
opcache.enable_cli=1
opcache.save_comments=1
opcache.huge_code_pages=1
opcache.memory_consumption=512
opcache.max_wasted_percentage=5
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=40960
opcache.validate_timestamps=0
opcache.force_restart_timeout=180
opcache.error_log=/u01/log/php/opcache.log
opcache.log_verbosity_level=1