php 8.1 及更高版本原生支持 fibers,8.0 及以下不支持;需用 php -v 确认版本 ≥ 8.1;fiber 通过 start/suspend/resume 手动控制,不可重用,协程为协作式,需显式挂起。

PHP 8.1 起原生支持 Fibers,但 PHP 8.0 **不支持** Fibers。所以严格来说,“PHP 8 怎么用 Fibers”实际指的是 **PHP 8.1 及更高版本**(如 8.2、8.3)。如果你当前使用的是 PHP 8.0 或更低版本,无法直接使用 Fibers——它不是通过扩展或 Composer 补丁能“加装”的功能,而是内核级新增的语言特性。
确认环境与基础写法
运行前务必检查:
- 执行
php -v确认版本 ≥ 8.1 - Fibers 默认启用,无需额外扩展(不像 Swoole 需编译安装)
- 代码中不能在 Fiber 外部调用
Fiber::suspend(),否则报致命错误
创建与控制一个 Fiber
Fiber 的核心是三个动作:启动(start)、挂起(suspend)、恢复(resume)。它不是自动调度的,需手动配合事件循环或逻辑驱动。
最简示例:
$fiber = new Fiber(function(): string {
echo "协程开始\n";
$input = Fiber::suspend('已就绪');
echo "收到数据: $input\n";
return '执行完毕';
});
<p>$output = $fiber->start(); // 输出"协程开始",暂停,返回'已就绪'
echo "主流程收到: $output\n"; // 输出"主流程收到: 已就绪"
$result = $fiber->resume('你好'); // 恢复,$input 赋值为'你好',继续执行
echo $result; // 输出"执行完毕"
</p>
模拟异步 I/O 流程(无真实非阻塞,但体现协作逻辑)
Fibers 本身不提供网络/文件非阻塞能力,它只是“可挂起的执行单元”。要真正实现非阻塞 I/O,需结合支持协程的底层库(如 amphp/amp 或 reactphp/react),或自行封装基于 stream_select 的事件循环。
典型协作模式示意:
- 协程发起 HTTP 请求 → 挂起,把 Promise 对象交还主循环
- 主循环监听该 Promise 完成 → 调用
resume($data)唤醒协程 - 协程继续执行后续逻辑(如查数据库),再次挂起等待结果
这种“挂起–唤醒–再挂起”链,让多任务在单线程里交替推进,避免阻塞等待。
注意事项与常见陷阱
Fibers 是协作式而非抢占式,这意味着:
- 协程不会自动让出 CPU;必须显式调用
Fiber::suspend()才能切换 - 不能在
try/catch外层捕获 Fiber 内未处理异常,建议在 Fiber 回调内包一层异常处理 - Fiber 实例不可重用:一旦状态变为
TERMINATED(执行完或异常终止),不能再resume - 变量作用域遵循闭包规则,
use传递外部变量需注意引用与值传递差异
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











