php 8.1 中 fiber 恢复执行必须显式调用 resume()(传值)或 throw()(抛异常),suspend() 仅挂起并返回值,需外部触发才能继续;状态检查(issuspended/isstarted等)可避免 fibererror。

PHP 8.1 中的 Fiber 挂起后,恢复执行上下文靠的是 resume() 方法,而不是自动调度或事件循环。关键在于:挂起(suspend())只是交出控制权,真正让代码继续往下走,必须由外部显式调用 resume(),并传入值——这个值会成为 suspend() 的返回值,从而让纤维从中断点“接上”执行。
fiber::suspend() 的作用是暂停并返回值
Fiber::suspend($value) 必须在 fiber 内部调用,它会立即停止当前 fiber 的执行,并把 $value 返回给调用 start() 或 resume() 的那一方。此时 fiber 进入 suspended 状态,等待被恢复。
- 如果 fiber 尚未启动,直接调用
suspend()会抛出FiberError -
suspend()的返回值,就是后续resume($x)传入的$x - 多次
suspend()是允许的,每次都需要对应一次resume()或throw()
fiber->resume() 是恢复执行的唯一入口
$fiber->resume($value) 由外部调用,它会唤醒处于 suspended 状态的 fiber,并把 $value 作为 suspend() 调用的返回值,让 fiber 从暂停处继续执行。
- 只能对已启动且当前挂起的 fiber 调用,否则抛出
FiberError - 恢复后,fiber 继续运行直到结束、再次
suspend(),或抛出异常 - 若 fiber 已终止(
isTerminated() === true),resume()返回null
异常也能触发恢复:fiber->throw()
除了传值恢复,还可以用异常中断恢复流程:$fiber->throw(new Exception('xxx')) 会让 fiber 在 suspend() 被调用的位置直接抛出该异常,相当于把异常“注入”到 fiber 的执行流中。
- 异常会在
suspend()所在行被抛出,可被 fiber 内部的try/catch捕获 - 若 fiber 此前已返回或未挂起,同样会报
FiberError - 这提供了比单纯传值更灵活的错误处理路径
如何确认 fiber 当前状态再操作
避免误调用导致异常,建议先检查状态:
-
$fiber->isStarted():是否已调用过start() -
$fiber->isSuspended():是否正处于挂起态(可安全resume()) -
$fiber->isRunning():是否正在执行中(此时不能resume()) -
$fiber->isTerminated():是否已执行完毕(不能再恢复)
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











