
PHP7内核剖析
文章平均质量分 91
吃着火锅x唱着歌
这个作者很懒,什么都没留下…
展开
-
PHP7内核剖析 学习笔记 第六章 函数
编译时,如果函数指定了返回值类型,则也为返回值创建一个zend_arg_info结构,该结构与参数的zend_arg_info结构保存在一起,即zend_op_array->arg_info数组中,返回值的zend_arg_info结构的保存位置为zend_op_array->arg_info[-1],即zend_op_array->arg_info指向的是参数开始的位置,而返回值的zend_arg_info结构在参数开始位置的前一位置。原创 2025-01-26 16:22:30 · 1212 阅读 · 0 评论 -
PHP7内核剖析 学习笔记 第五章 PHP的编译与执行(2)
5.4PHP的执行ZendVM执行器由指令处理handler与调度器组成:指令处理handler是每条opcode定义的具体处理过程,根据操作数的不同类型,每种opcode可定义25个handler,执行时,由执行器调用相应的handler完成指令的处理;调度器负责控制指令的执行,以及执行器的上下文切换,由调度器发起handler的执行。5.4.1handler的定义所有opcode的处理handler定义在Zend/zend_vm_def.h中,定义时不需要为每一条opcode定义25个handler原创 2025-01-19 00:55:32 · 648 阅读 · 0 评论 -
PHP7内核剖析 学习笔记 第五章 PHP的编译与执行(1)
PHP的编译与执行是两个相对独立的阶段,编译的流程为词法分析、语法分析、抽象语法树的生成,执行阶段则是根据编译阶段输出的产物(即opline指令)进行执行。5.1 语言的编译与执行计算机只认识机器语言,无法理解人类定义的编程语言,因此需要将编程语言翻译为机器语言,这个翻译过程称为编译。根据编译的时机不同,编程语言可分为编译型、解释型。编译型语言在程序运行前提前编译为计算机可执行的二进制文件,在执行时直接执行机器指令,这种类型语言的典型代表就是C、C++、Golang;解释型语言是程序在运行时由解释器边原创 2025-01-10 23:05:01 · 1246 阅读 · 0 评论 -
PHP7内核剖析 学习笔记 第四章 内存管理(2)
所有线程的tsrm_tls_entry结构保存在tsrm_tls_table数组中,该数组是一个全局变量,操作这个变量时需要加锁。然后根据线程id从tsrm_tls_table数组中获取tsrm_tls_entry,这里需要对取到的tsrm_tls_entry遍历,比较线程id,以找到该线程的tsrm_tls_entry,如果没有找到则表示线程还未分配tsrm_tls_entry,进入第2步进行分配,如果找到了则表示已经分配了tsrm_tls_entry,进入第3步返回storage中对应的资源。原创 2024-12-28 15:57:02 · 989 阅读 · 0 评论 -
PHP7内核剖析 学习笔记 第四章 内存管理(1)
PHP中的变量不需要手动释放,内核实现了变量的内存管理,包括内存的分配与回收。4.1 变量的自动GC机制C/C++语言中,如果想在堆上分配变量,需要手动进行内存的分配与释放,变量的内存管理是一件非常烦琐的事情,稍有不慎就可能导致不可预知的错误。现代高级语言普遍提供了变量的自动GC机制,由语言自己进行管理,这使得开发者不需要再去关心变量的分配与释放,PHP也实现了这种机制,PHP中可直接通过$声明一个变量,使用完也不需要手动销毁,内核自己清楚什么时间该进行释放。我们先自己思考下如何实现自动GC,最简单的原创 2024-12-24 21:45:15 · 969 阅读 · 0 评论 -
PHP7内核剖析 学习笔记 第三章 数据类型
type_info实际是将v结构的4个成员组合到了一起,v中的成员各站一个字节,总共4个字节,type_info也是4个字节,每个字节对应v的一个成员,可直接通过type_info位移获取v成员的值。如果发现中间映射表中要设置的位置已经被之前插入的元素占用了(值不等于初始化的-1),那么会把已经存在的值保存到新插入的Bucket中(实际是将Bucket的zval成员的u2.next指针指向已经存在的Bucket),然后将中间映射表中的值更新为新Bucket的存储位置,即每次都会把冲突的元素插到开头。原创 2024-12-14 18:36:56 · 1087 阅读 · 0 评论 -
PHP7内核剖析 学习笔记 第二章 SAPI
其中Cli和Fpm是完整实现的应用程序,它们有定义自己的main函数,方便我们从入口开始逐步分析PHP的处理,尤其是单进程的Cli,非常方便调试,本书后面章节基本都是以Cli模式为例的。fpm_init()中主要的处理就是上面介绍的几个init过程,完成这些初始化操作后就是最关键的fpm_run()操作了,此环节将fork子进程,启动进程管理器,执行后master进程将不会返回main()函数,之后各worker进程会返回,也就是说main()函数中调用fpm_run()之后的操作均是worker进程的。原创 2024-12-08 21:01:08 · 994 阅读 · 0 评论 -
PHP7内核剖析 学习笔记 第一章 PHP基础架构
这个版本被命名为PHP2,已经有了今日PHP的一些雏形,类似Perl的变量命名方式(Perl也用$声明标量变量,标量变量可以存储单一的值,如整数、浮点数、字符串,此外Perl中还有用@声明的数组变量和%声明的散列变量)、表单处理功能、嵌入到HTML中执行的能力。在编译阶段,PHP脚本将经历从PHP源代码到抽象语法树再到opline指令的转化过程,最终生成的opline指令就是Zend引擎可识别的执行指令,这些指令接着被执行器执行,这就是PHP代码解释执行的过程,本书介绍的大部分内容都是关于这两个阶段的。原创 2024-12-04 21:35:06 · 714 阅读 · 0 评论