JOE'S BLOG

好记性不如烂键盘

0%

认识PHP的一些基本原理

从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大阶段:

  1. 模块初始化阶段 php_module_startup
  2. 请求初始化阶段 php_request_startup
  3. 执行阶段 php_execute_script
  4. 请求关闭阶段 php_request_shutdown
  5. 模块关闭阶段 php_module_shutdown

web模式没有1或5