从PHP的执行原理开始
PHP是一门解释型语言,执行过程如下:
第一步:源码通过词法分析得到Token。Token是PHP代码被切割成的有意义的标识。在zend_language_parse.h文件中做了定义,比如echo对应的Token是T_ECHO,值为328
第二步:语法分析将Token和符合文法规则的代码生成抽象语法树。在PHP7中,AST是新特征
第三步:将AST生成对应的opcode,并被虚拟机执行。opcode是PHP定义的一组指令标识,对应相应的handler。opcodes是opcode的集合形式,是PHP执行过程的中间代码,类似Java的字节码。PHP优化中有一个常见的“开启opcache”,指的就是opcodes的缓存
PHP7内核架构
主要来自于《PHP7底层设计与源码实现》
Zend引擎:词法/语法分析、AST编译和opcodes的执行均在Zend引擎中实现。引擎为PHP提供了基础服务,PHP的可靠性和高性能都依赖引擎的基础支撑。
PHP层:来自外部的交互通过PHP层来处理。
SAPI:SAPI(Server API),包含了常见的cli SAPI,cgi SAPI和fmpSAPI。SAPI提供了一个和外部通信的接口。
扩展部分:Zend引擎提供了核心能力和接口规范。在此基础上进行扩展开发。
以下为几种常见的SAPI
- cli: PHP的命令行交互接口
- fpm-fcgi: fmp全称为FastCGI Process Manager,PHP官方提供的FastCGI进程管理器。举例来说,当有http请求发送到nginx服务器,nginx按照FastCGI协议把请求交给php-fpm进程处理
- apache2handler: Apache扩展,编译后生产动态链接库,配置到Apache下,当有http请求到Apache时,根据配置会调用此动态链接库,执行PHP代码,完成与PHP的交互
PHP的生命周期
在cli模式下,PHP的执行过程主要分为5大阶段:
- 模块初始化阶段 php_module_startup
- 请求初始化阶段 php_request_startup
- 执行阶段 php_execute_script
- 请求关闭阶段 php_request_shutdown
- 模块关闭阶段 php_module_shutdown
web模式没有1或5