深入解析PHP底层之Running process
时间:2021-06-19
来源:互联网
今天PHP爱好者给大家带来本篇文章带大家深入解析一下PHP Running process。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。
PHP的底层语言是C语言 C语言是编译型 语言。
编译型语言:程序在执行之前需要一个专门的编译过程,把程序编译成 为机器语言的文件,运行时不需要重新翻译,直接使用编译的结果就行了。程序执行效率高,依赖编译器,跨平台性差些
----------编译型语言_百度百科
那么PHP是怎么变成解释型语言的呢?
我用processon做了张图 以后慢慢再持续填坑
图片如果不清晰可以看原图
地址:http://assets.processon.com/chart_image/603b293b1e08530bb1adcb1c.png
简单说明下图片的过程
一 先不考虑 CLI和FPM等流程 C语言通过 open_file_sanning函数解析到php后缀的文件
二 调用编译函数zend_compile_file()来进行编译。 这个函数的具体实现其实是包括两个主要过程的:词法分析(Lex实现),语法分析(Yacc实现)。当执行完这个函数之后:php脚本的编译就算结束了。 这个函数的输入是:php脚本文件,而输出则是op_array.简单一点说:编译过程就是把脚本给解析成一条条php虚拟机可以处理的指令,而op_array就是这些指令做成的一个array而已(这很类似一些编译型语言编译产生的汇编代码了,也是一条条的命令
三 VM虚拟机调用zend_execute()函数来执行。该函数的输入就是上边编译阶段产生的op_array,在这里他会解析每条命令并进行处理。 在PHP7.4.5中op命令一共有将近200条所以它需要处理这些命令。每条命令都是有对应的处理器来进行处理的。zend虚拟拟机会依据op_array中各条命令的类型来分发给响应的处理器来进行处理。这里的处理器是 zend虚拟机的处理器。不是CPU
Zend虚拟机 处理器其实是处理op命令的逻辑。其可以以函数的形式存在,也可能是以逻辑段的方式存在,这取决于命令的分发方式
Zend 虚拟机中分发命令的机制有三种:CALL, SWITCH, 和GOTO这三种类型. switch和goto都是在zend_execute()这个函数中有对应的逻辑段,直接执行就可以了。而call是在zend_execute()这个函数中执行函数调用。
你可以发现PHP代码其实跑在了 zend vm虚拟机里 没有直接运行在CPU中
而 PHP8 中JIT的出现 可以让部分代码汇编成 机器码 跑在CPU中 关于这部分可以参考 @rhett文章《PHP JIT 技术详解》做的分析。文章地址:https://zhuanlan.zhihu.com/p/331777202
感谢陈雷前辈的《PHP7源码底层设计与实现》
本文经原作者PHP崔雪峰同意,发布在php爱好者,原文地址:https://zhuanlan.zhihu.com/p/353501903
以上就是深入解析PHP底层之Running process的详细内容,更多请关注php爱好者其它相关文章!
-
炉石传说绿野大作战模式攻略_炉石传说绿野大作战有哪些强力卡组推荐 时间:2025-05-08
-
原神爱可菲培养指南_原神爱可菲要如何进行培养 时间:2025-05-08
-
原神香韵奏者抽取建议指南_原神香韵奏者抽取建议攻略 时间:2025-05-08
-
dnf手游驱魔师毕业装备搭配推荐_dnf手游驱魔师毕业装备搭配指南 时间:2025-05-08
-
英雄没有闪秘法师电离电光束流搭配指南_英雄没有闪秘法师电离电光束流搭配推荐 时间:2025-05-08
-
光与影33号远征队繁叶结如何获取_光与影33号远征队繁叶结获取指南 时间:2025-05-08
今日更新
-
字节是计算机什么的基本单位
阅读:18
-
什么是网络协议?常用的应用层协议包括哪些?
阅读:18
-
主频是反映计算机什么的性能指标
阅读:18
-
如何使用正则替换的方式实现清除字符串中所有的HTML标签?
阅读:18
-
什么是计算机网络?它的主要功能有哪些?
阅读:18
-
计算机内部数据加工处理和传送的形式是什么
阅读:18
-
JavaScript中如何声明常量
阅读:18
-
php中die函数怎么使用
阅读:18
-
javascript中random用法是什么
阅读:18
-
php如何对数组进行转码
阅读:18