PHP的执行分三个阶段:处理请求的开始阶段、处理请求阶段、请求之后的结束阶段。
处理请求的开始阶段:
1 模块初始化阶段(MINIT),在整个SAPI生命周期内(例如Apache启动以后的整个生命周期内或者命令行程序整个执行过程中),该过程只进行一次。(这应该就是为何修改了php.ini之后,要重启Apache的原因);
2 请求初始化阶段(RINIT),该过程发生在请求阶段, 例如通过url请求某个页面,则在每次请求之前都会进行模块激活。(为何不先激活呢?因为方便模块在RINIT阶段针对各种请求设置环境变量或其他的操作);
处理请求阶段:
1 词法分析:将php文件翻译成一个个的token;
2 语法分析:根据生成的token和语法规则进行分析;
3 Zend引擎:将代码编译为opcode后并执行,在执行的过程中还会重复进行编译-执行,例如执行了include语句 (为何不在第一次编译就把这些包含进来的文件也一起编译好?);
.调用SAPI的输出函数返回执行结果。
处理请求的结束阶段:
1 关闭请求:RSHUTDOWN对应于RINIT,释放资源等操作
2 关闭模块:MSHUTDOWN对应于MINIT,SAPI生命周期结束(Web服务器退出或者命令行脚本执行完毕退出)