深入解析PHP生命周期:从模块初始化到请求关闭的完整流程

PHP生命周期

深入解析PHP生命周期:从模块初始化到请求关闭的完整流程

● 模块初始化

激活SAPI,加载各个扩展模块初始化函数,初始化垃圾收集器,启动zend引擎,解析读取php.ini配置信息,分配内存。

● 请求初始化

CLI模式下没有请求初始化,直接跳过; apache和cgi类的SAPI会对每个请求进行请求初始化,调用每个扩展请求初始化函数,并初始化环境变量。

● 执行脚本

● 请求关闭

刷新输出内容、发送 HTTP 响应标头、清除全局变量以及调用每个扩展请求关闭函数。

● 模块关闭

回调各扩展的模块关闭钩子函数。

程序的入口点是sapi的main函数。在main函数中创建sapi_module_struct,绑定钩子函数,然后调用/main目录下的public函数执行。

PHP 数组的工作原理

PHP数组的核心是哈希表,它使用链表的方法来解决哈希冲突。 PHP数组的原理:元素单独存储在一个有序列表中,并且有一个中间表存储数组元素在列表中的下标。 PHP的具体内部实现方法是在初始化列表时额外分配一个与索引表长度相同的uint32片段。从链表的中间位置开始,先向前寻址索引表得到存储表下标,然后向后寻址存储表得到元素。价值。

当数组空间满时,插入数组元素的操作会触发扩容机制。首先,检查删除元素的比例。如果比例达到阈值,则会重建索引和桶列表。如果比例未达到阈值,则会分配一个新数组,其大小是原始数组的两倍。大批。然后将原数组的元素复制到新数组中并重建索引(相当于重新插入所有元素)。

PHP参考原理

当使用引用符号&来赋值时,会为&操作的变量创建一个zend_reference结构体。该结构体包含原始变量的zval和一个gc结构体。当另一个变量指向这个引用时,gc中的引用计数(gc.refcount)加一。

PHP 变量的内存模型

PHP变量的内存管理思想是:字符串和数组类型使用引用计数和写时复制;标量类型和 NULL 使用简单的内存模型进行深度复制;对象和资源不能复制,只能引用。

● 写时复制原理:

zend_value 中的子结构都包含 gc 结构。赋值时,首先将变量值的引用指向右值的zend_value子结构,然后将gc的引用计数加一;当分配的变量发生变化时,会复制一个新值。当分配给变量时,原始值的引用计数减一。

如何释放PHP中循环引用产生的垃圾

当变量的引用计数减少并且大于0时,该变量可能是垃圾。 GC会收集该变量,并在达到一定数量时开始识别并回收垃圾。原理是把所有内部value成员的引用计数减1。这样一来,如果value本身的引用计数变成0,则说明所有引用都来自内部成员,可以被回收。如果值本身的引用计数大于0,则说明它不是垃圾,需要将内部成员的引用计数加一。

PHP代码执行流程

PHP代码在Zend虚拟机中编译执行,通过词法和语法分析生成抽象语法树,然后将语法树提供的信息进一步构造成opline。所有 opline 编译的指令集和文字都存储在 op_array 中并由 ZendVM 顺序执行。

opline 是一个包含符号表、操作数、操作码和返回值的结构体。操作码根据操作数执行操作(计算、循环等)。

PHP输出缓冲过程

调用输出函数时,如果内容长度大于output_buffering设置的大小,或者调用ob_flush函数,数据就会从PHP缓冲区进入SAPI缓冲区;此时如果调用flush函数或者打开implicit_flush配置项,则会继续刷新内容。刷入应用层(apache、fastCGI等),那么就脱离了PHP的控制。

分析下面的代码。克隆$this有什么意义?为什么不直接修改并返回 $this

1
2
3
4
5
6

public function withBody(StreamInterface $body)
{
  $newThis = clone $this;
  $newThis->body = $body;
  return $newThis;
}

在不改变当前对象的情况下派生新对象的意义在于,这种方法对当前对象没有副作用,并且是线程安全的。如果直接修改$this,是线程不安全的。当两个线程同时调用时,body的值是不确定的。

你可能想看:
« 上一篇
下一篇 »

相关推荐

php实时推送,php实地培训

2026年10月05日

55阅读

php乱码出现问号的原因,php乱码出现问号的原因有哪些

2026年10月05日

46阅读

php一句话木马,一句话木马ctf

2026年10月05日

49阅读

php获取数组长度,php中如何获取数组的长度

2026年10月05日

51阅读

php面试题库及答案,php程序员面试真题库

2026年10月05日

49阅读

phpcontent-type修改,php源码二次修改需要多少钱

2026年10月05日

44阅读