PHP本质的术语大全的庖丁解牛
核心内核PHP本质是一门嵌入在Web场景、C语言编写的解释型脚本语言内核把PHP源码翻译成Opcode指令在Zend虚拟机上执行它的定位是快速解决动态网页业务上层语法面向开发者底层依托操作系统进程、内存、文件、网络系统调用。承接前面进程空间、堆栈、对象、实例化、FPM整套知识。类比PHP内核是一台专用小型虚拟机PHP代码是写给这台虚拟机的剧本剧本不是直接给CPU执行先编译成虚拟机指令虚拟机逐行执行剧本。一、本源底层术语Zend引擎 Zend EnginePHP的核心内核C语言开发。负责词法分析、语法解析、编译生成Opcode、Zend虚拟机执行、内存管理、符号表、对象模型、垃圾回收。PHP语言本身的语法规则、面向对象、变量体系全部由Zend引擎实现。PHP Zend引擎 标准扩展库。解释型脚本语言传统PHP不是编译为原生CPU二进制程序。源码读取后运行期才解析、编译成Opcode交给Zend虚拟机执行区别于C/CC是提前一次性编译成机器码。OPcache会缓存Opcode省去重复编译步骤。脚本语言不需要独立编译链接步骤写完源码直接运行代码作为文本存在.php文件方便快速修改、迭代。宿主语言C语言Zend引擎和绝大多数PHP内置扩展PDO、curl、gd等全部用C开发。PHP只是C程序之上提供的一套语法层。PHP的所有能力最终都是调用C函数、发起操作系统系统调用。Opcode操作码Zend虚拟机指令。PHP源码不会直接执行经过词法、语法分析后编译成一组Opcode。一行PHP代码会被拆解成多条Opcode指令。OPcache就是缓存Opcode避免每次请求重复编译源码。Zend虚拟机Zend VM虚拟机负责逐条执行Opcode。不是硬件CPU是C写出来的软件虚拟机。PHP变量、对象、函数调用全部在Zend VM中调度。词法分析 Lex扫描PHP源码文本拆成token令牌关键字、变量名、运算符、字符串。语法分析 Yacc读取token构建抽象语法树AST校验语法是否合法。语法写错少分号、括号不匹配在这里抛出解析错误。AST 抽象语法树源码的树形结构化表达编译器中间产物从AST生成Opcode。PHP7引入AST重构编译流程。二、PHP运行模型术语SAPI 服务器应用程序编程接口PHP内核对外的接入层是PHP和外部程序交互的桥梁。PHP内核本身不绑定Web依靠SAPI切换运行模式。FPM SAPI网页主流php-fpmCLI SAPI命令行脚本CGI SAPI老式通用网关接口embed嵌入到C程序一句话SAPI定义PHP怎么接收输入、输出结果、管理请求生命周期。单请求模型FPMFPM SAPI经典特征一次HTTP请求执行一套PHP脚本请求结束释放本次请求业务内存保留进程全局类/常量等待下一次请求。常驻模型CLI长进程Swoole/HyperfCLI模式下进程不会在单次任务后清空业务变量变量、对象持续驻留堆内存需要开发者手动管理内存容易出现内存泄漏、全局变量污染。请求生命周期 Request LifecycleSAPI启动阶段 → 模块初始化 → 请求初始化RINIT → 执行脚本 → 请求关闭RSHUTDOWN释放本次请求变量 → 进程结束才执行模块关闭。FPM worker复用进程MINIT/MSHUTDOWN只执行一次RINIT/RSHUTDOWN每次请求执行。三、变量与Zend底层术语zvalZend引擎变量容器。所有PHP变量统一用zval结构体描述存储类型、值、引用计数。标量、数组、对象句柄全部封装在zval。符号表 Symbol Table哈希表结构记录变量名到zval的映射。全局符号表、函数局部符号表、类符号表。前面讲的PHP符号表就是它。写时复制 COW Copy On Write字符串、普通数组底层优化。多变量共用一份底层数据只有修改其中一个变量才拷贝一份新数据。对象不启用COW对象只复制句柄。引用计数 refcountzval内置计数器追踪有多少符号指向这份数据用于GC内存回收。垃圾回收 GCZend的内存回收机制基础依靠引用计数额外配套环形GC处理循环引用。四、面向对象模型Zend Objectzend_class_entry 类入口类在内核中的结构体保存类名、方法表、属性表、常量。类定义加载后存入进程全局内存不属于对象实例。zend_object 对象实体堆上对象本体存放属性哈希表持有zend_class_entry指针附带对象句柄。new实例化就是创建zend_object。魔术方法Zend引擎预留的事件钩子。特定运行事件自动触发例如__construct、__destruct、__get、__set。晚静态绑定 LSB Late Static Binding内核运行时解析static对应的类区别于self编译期绑定。五、扩展体系术语PHP扩展 ExtensionC编写的模块给PHP增加能力。分为内核内置扩展、第三方扩展。如pdo、redis、swoole。扩展向上暴露PHP函数/类向下调用操作系统API。核心扩展 vs 用户扩展核心扩展随PHP源码自带用户扩展需要单独编译安装。钩子 Hook扩展可以挂载内核钩子在请求、函数调用、对象实例化等节点插入自定义逻辑。六、IO与系统调用层系统调用 syscallPHP的echo、file_get_contents、fsockopen、数据库连接最终都会由内核/扩展调用操作系统系统调用让操作系统完成读写文件、网络收发。PHP本身没有独立IO硬件能力全部依托操作系统。流 StreamPHP统一IO抽象层文件、socket、php://stdin、php://memory都封装成stream统一读写接口。七、PHP语言特性本质术语弱类型动态类型变量没有固定类型声明变量类型随赋值自动变化。PHP7支持强制类型声明但仍然属于动态类型系统。区分弱类型≠无类型。动态语言可以运行时新增类、新增函数、动态给对象增加属性PHP8.2废弃原生动态属性代码结构可以在执行阶段变动。动态绑定函数、方法调用在运行期确定不是编译期确定。全局状态FPM模型中进程全局符号、类定义常驻全局变量在单次请求生命周期存在请求结束清空。常驻服务中全局变量极易造成数据污染。八、高频误区术语误区PHP是C语言PHP代码直接编译成机器码纠正PHP源码编译为Opcode由Zend虚拟机执行底层Zend引擎本身是C写的二者不是一回事。误区PHP只能用于Web网页纠正PHP依靠SAPICLI模式可以写脚本、爬虫、服务端程序Web只是最主流场景。误区OPcache把PHP编译成C代码纠正OPcache缓存Opcode虚拟机指令不是机器码。误区PHP的对象是语法糖底层没有特殊结构纠正Zend有独立zend_object对象结构体和数组哈希表是两套结构。误区每次请求都会重新加载Zend引擎纠正FPM worker进程启动Zend引擎初始化一次反复复用处理请求。九、人生符号类比PHP本质就是一套由C语言写出来的翻译执行系统。你写的文字代码会被翻译成一套虚拟机指令虚拟机按顺序执行所有变量、对象都记录在符号表里。SAPI是它对外的接口既可以对接网页也可以对接命令行。每次FPM请求就像完成一次任务任务临时变量清理但底层虚拟机和类模板保留。庖丁解牛一句话总结PHP本质是C语言开发的、基于Zend虚拟机执行Opcode的动态脚本语言由Zend引擎SAPI扩展构成源码编译为OpcodeZend VM执行依靠zval、符号表、引用计数管理内存SAPI决定运行模式FPM/CLIFPM是短请求复用进程模型PHP所有文件、网络能力最终调用操作系统系统调用动态弱类型支持面向对象扩展用来拓展能力。