了解了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模式下,每次请求都要处理一遍,是对系统资源极大的浪费,那么有没有办法优化呢?
当然有,如:
-
OPCache:前身是Zend Optimizer+ ,是 Zend Server 的一个开源组件;官方出品,强力推荐
-
APC:Alternative PHP Cache 是一个开放自由的 PHP opcode 缓存组件,用于缓存、优化 PHP 中间代码;已经不更新了不推荐
-
APCu:是APC的一个分支,共享内存,缓存用户数据,不能缓存opcode,可以配合Opcache 使用
-
eAccelerate:同样是不更新了,不推荐
-
xCache:不再推荐使用了