PHP项目中,尤其是在高并发大流量的场景中,如何提升PHP的响应时间,是一项十分重要的工作。
而Opcache又是优化PHP性能不可缺失的组件,尤其是应用了PHP框架的项目中,作用更是明显。
在理解 OPCache 功能之前,我们有必要先理解PHP-FPM + Nginx 的工作机制,以及PHP脚本解释执行的机制。
1.1 PHP-FPM + Nginx 的工作机制
请求从Web浏览器到Nginx,再到PHP处理完成,一共要经历如下五个步骤:
第一步:启动服务
第二步:Request => Nginx
第三步:Nginx => PHP-FPM
第四步:PHP-FPM Master => Worker
第五步:PHP-FPM Worker => Master => Nginx
1.2 PHP脚本解释执行的机制
了解了PHP + Nginx 整体的处理流程后,我们接下来看一下PHP脚本具体执行流程,
首先我们看一个实例:
<?php
if (!empty($_POST)) {
echo "Response Body POST: ", json_encode($_POST), "\n";
}
if (!empty($_GET)) {
echo "Response Body GET: ", json_encode($_GET), "\n";
}
我们分析一下执行过程:
php初始化执行环节,启动Zend引擎,加载注册的扩展模块
初始化后读取脚本文件,Zend引擎对脚本文件进行词法分析(lex),语法分析(bison),生成语法树
Zend 引擎编译语法树,生成opcode,
Zend 引擎执行opcode,返回执行结果
在PHP cli模式下,每次执行PHP脚本,四个步骤都会依次执行一遍;
在PHP-FPM模式下,步骤1)在PHP-FPM启动时执行一次,后续的请求中不再执行;步骤2)~4)每个请求都要执行一遍;
其实步骤2)、3)生成的语法树和opcode,同一个PHP脚本每次运行的结果都是一样的,
在PHP-FPM模式下,每次请求都要处理一遍,是对系统资源极大的浪费,那么有没有办法优化呢?
当然有,如: