场景:
QPS不高,但CPU和内存消耗特别高,CPU消耗甚至达到100%
排除因素:
1、MySQL等数据库不存在慢查询
2、有Redis等缓存机制
3、接口代码不存在复杂逻辑、多层循环计算
猜测:
TP等PHP框架每次运行时需要加载大量框架文件,框架文件在编译过程中会造成服务器CPU消耗很大,导致接口性能下降
解决方案:
利用 Opcache 缓存编译好的文件,减少每次编译框架代码的次数
Opcache介绍:
Opcache通过将解析的PHP脚本预编译的字节码(Operate Code)存放在共享内存中来避免每次加载和解析PHP脚本的开销,解析器可以直接从共享内存读取已经缓存的字节码(Operate Code),从而大大提高PHP的执行效率。
当解释器完成对脚本代码的分析后,便将它们生成可以直接运行的中间代码,也称为操作码(Operate Code,opcode)。
Opcode cache 的目的是避免重复编译,减少CPU和内存开销。
如果动态内容的性能瓶颈不在于CPU和内存,而在于I/O操作,比如数据库查询带来的磁盘I/O开销,那么opcode cache的性能提升是非常有限的。
Opcache原理:
PHP 从获取请求到发出响应的过程:
接受 request 请求(nginx,apache等)-> Zend引擎读取.php文件 -> 扫描其词典和表达式 -> 解析PHP文件 -> 创建要执行的计算机代码(称为Opcode) => 执行Opcode -> response 返回
改进方案:
如果源代码没有变化,那么Opcode也不会变化,因此可以把Opcode缓存下来,以后直接访问缓存的Opcode,如下图虚线部分