PHP 7.4.24 不原生支持协程,仅通过 Generator + yield 提供挂起/恢复上下文的基础能力;完整协程运行时需依赖 Swoole 等第三方扩展。

PHP 7.4.24 本身并不原生支持协程(Coroutine),它没有内置的协程调度器、go() 语法或自动 IO 协程化能力。这一点必须明确:PHP 7.4 的 Generator + yield 是协程的“基础能力”,但不是完整的协程运行时。
真正让 PHP 具备生产级协程能力的,是第三方扩展——主要是 Swoole(需单独编译安装),而 不是 PHP 内核本身。因此,讨论“PHP 7.4.24 源码的协程底层实现”,实质上是在说:
PHP 内核如何为协程提供支撑?核心就是 Generator 机制,而 yield 的挂起/恢复行为是唯一由 Zend 引擎直接实现的“协程原语”。
下面从源码角度分三部分讲清关键实现:
Generator 是协程的内核载体
PHP 7.4 中,Generator 是一个特殊的内部类(zend_generator),定义在 Zend/zend_generators.h:
struct _zend_generator {
zend_object std;
zend_execute_data *execute_data; // 关键:保存整个执行上下文(栈帧、变量表、指令指针等)
zval value; // 当前 yield 返回的值
zval key; // 可选键(yield $key => $value)
uint8_t flags; // 如 ZEND_GENERATOR_CURRENTLY_RUNNING、ZEND_GENERATOR_FORCED_CLOSE 等
// …其他字段(frozen_call_stack, retval, send_target 等)
};
这个结构体让函数能“冻结”自身状态。每次 yield 执行时,Zend 不销毁栈,而是把 execute_data 挂起并存入 zend_generator 对象中——这就是用户态上下文保存的全部秘密。
yield 的挂起过程发生在 zend_vm_execute.h 和 zend_generators.c
当解释器执行到 ZEND_YIELD 指令(opcode),流程进入 zend_generator_yield()(位于 Zend/zend_generators.c):
- 把当前
execute_data->return_value(即 yield 表达式的值)赋给generator->value - 设置
generator->flags |= ZEND_GENERATOR_CURRENTLY_RUNNING - 调用
zend_generator_close()或zend_generator_resume()前会检查该标志,防止重入 - 最终通过
EG(current_execute_data) = generator->execute_data切换回调用方上下文,控制权交还给 foreach / ->next() 调用者
注意:此时函数并未返回,栈帧未销毁,所有局部变量、$this、use 变量都保留在 execute_data->symbol_table 和 execute_data->extra_vars 中。
Generator 对象本身就是一个可恢复的协程实例
你写:
function task() {
echo "A\n";
yield;
echo "B\n";
}
$g = task();
$g->current(); // 输出 A
$g->next(); // 输出 B,从 yield 后继续
在底层:
-
$g是zend_generator对象,task()函数体被编译为一段可重入的 opcode 序列 -
->current()触发首次执行,走到yield暂停,返回"A" -
->next()调用zend_generator_resume(),恢复execute_data,从下一条 opcode(ECHO "B")继续执行
这完全符合协程定义:主动挂起、手动恢复、共享栈空间、无系统线程切换开销。
但也要清楚它的局限:
- 无法自动挂起阻塞 IO(如
file_get_contents仍是同步的) - 没有调度器,不能并发跑多个 Generator 并自动切换
- 不支持
send()外部传值以外的跨协程通信
所以严格来说:
✅ PHP 7.4.24 源码实现了 协程的最小可行单元(suspend/resume + context capture)
❌ 它没有实现 协程运行时(scheduler、hook、context isolation、协程池) —— 这些全靠 Swoole 在用户态补全。
不复杂但容易忽略
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











