AI写作智能体 自主规划任务,支持联网查询和网页读取,多模态高效创作各类分析报告、商业计划、营销方案、教学内容等。 广告
**php内核参考** https://github.com/pangudashu/php7-internal https://www.php.cn/php-weizijiaocheng-396287.html ``` <?php echo "Hello World"; $a = 1 + 1; echo $a; ?> ``` **模块初始化:php_module_startup()** ``` 由apache、nginx触发 调用各个模块的MINIT方法 调用RINIT启动Zend引擎 初始化垃圾回收器 注册PHP定义的常量:PHP_VERSION等 解析php.ini 注册扩展,包括静态编译的扩展和动态加载的扩展 ``` **请求初始化:php_request_startup()** ``` 激活Zend引擎 激活SAPI SAPI是服务器端应用编程接口。 这是 PHP 内核提供给外部调用其服务的接口,即外部系统可以通过 SAPI 来调用 PHP 提供的编译脚本、执行脚本的服务。PHP 中实现的 SAPI 有很多,Cli、Fpm 是我们比较常见的。 ``` **脚本执行:php_execute_script()** ``` 读取PHP源代码 -> 将源代码转换为语言片段TOKEN -> 将TOKEN转换为简单而有意义的表达式 -> 将表达式转换为OPCODE opcode是将PHP代码编译产生的Zend虚拟机可识别的指令,php7共有173个opcode,定义在zend_vm_opcodes.h中 PHP中的所有语法实现都是由这些opcode组成的。 编译是在zend_compile.h struct _zend_op函数执行。 zend_op_array是Zend引擎执行阶段的输入,整个执行阶段的操作都是围绕着这个结构 https://blog.csdn.net/pangudashu/article/details/68921858 -> 将OPCODE转换为AST抽象语法树 -> 执行器顺序执行opcodes 每次执行一条 现在有的Cache比如APC,可以使得PHP缓存住Opcodes,这样,每次有请求来临的时候,就不需要重复执行前面3步,从而能大幅的提高PHP的执行速度。 ``` Lex就是一个词法分析的依据表。 Zend/zend_language_scanner.c会根据Zend/zend_language_scanner.l(Lex文件),来输入的 PHP代码进行词法分析,从而得到一个一个的“词” PHP4.2开始提供了一个函数叫token_get_all,这个函数就可以讲一段PHP代码 Scanning成Tokens; 源码中的字符串,字符,空格,都会原样返回。每个源代码中的字符,都会出现在相应的顺序处。而,其他的比如标签,操作符,语句,都会被转换成一个包含俩部分的Array: Token ID (也就是在Zend内部的改Token的对应码,比如,T_ECHO,T_STRING),和源码中的原来的内容。 接下来,就是Parsing阶段了,Parsing首先会丢弃Tokens Array中的多于的空格,然后将剩余的Tokens转换成一个一个的简单的表达式 ``` 1.echo a constant string 2.add two numbers together 3.store the result of the prior expression to a variable 4.echo a variable ``` 然后就改Compilation阶段了,它会把Tokens编译成一个个op_array, 每个op_arrayd包含如下5个部分: ``` 1.Opcode数字的标识,指明了每个op_array的操作类型,比如add , echo 2.结果 存放Opcode结果 3.操作数1 给Opcode的操作数 4.操作数2 5.扩展值 1个整形用来区别被重载的操作符 ``` 比如,我们的PHP代码会被Parsing成: ``` * ZEND_ECHO 'Hello World' * ZEND_ADD ~0 1 1 * ZEND_ASSIGN !0 ~0 * ZEND_ECHO !0 ``` ![image](https://www.laruence.com/medias/2020/06/Screen-Shot-2020-06-28-at-18.31.57.png) **请求关闭:php_request_showdown()** ``` flush输出内容 发送HTTP应答header头 清理全局变量 关闭编译器 关闭执行器 回调各扩展request shutdown钩子函数 ``` **模块关闭:php_module_showdown()** ``` php执行完,或遇到die、exit 都会触发RSHUTDOWN. 进行资源清理、PHP各模块关闭、回调各扩展moduel shutdown钩子函数。 SAPI生命周期结束,WEB服务器退出,会关闭模块,执行MSHUTDOWN方法 php终止执行会调用:register_shutdown_function ```