当前位置: 首页 > news >正文

别再混淆 PHP8.1 中纤程 Fibers 和协程 Coroutines 了 一文搞懂它们的区别

别再混淆 PHP8.1 中纤程 Fibers 和协程 Coroutines 了 一文搞懂它们的区别

PHP 从早期那个只能写动态网页的简单脚本语言,发展到现在已经走了很远。PHP 8.1 的发布带来了一个特别令人兴奋的新功能:纤程(Fibers)—— 这个强大的特性为语言引入了结构化并发。

但有个问题:很多开发者还是会把协程纤程(Fibers)搞混,经常把它们当成一回事。虽然确实有相似的地方,但这两个概念有重要的区别。在设计异步或并发 PHP 应用时,搞清楚这些区别很重要。

让我们来详细分析一下。

原文链接-别再混淆 PHP8.1 中纤程 Fibers 和协程 Coroutines 了 一文搞懂它们的区别

什么是协程?

协程是一个通用的编程概念。你可以把它想象成一个特殊的函数,能够在某些地方暂停,然后稍后从暂停的地方继续执行。

在 PHP 中,协程通常通过生成器(yield)来实现。例如:

<?phpfunction coroutineExample() {echo "Start\n";yield;echo "Resume\n";
}$coroutine = coroutineExample();
$coroutine->current();  // Start
$coroutine->next();     // Resume

这里,yield 允许函数暂停,将控制权返回给调用者,稍后再恢复。

这让协程在异步 I/O、数据管道和惰性求值方面特别有用。像 ReactPHP 和 Amp 这样的库底层就大量使用协程。

流程图:

┌─────────────┐
│ 开始函数     │
└──────┬──────┘│▼yield (暂停)│▼恢复执行│▼函数结束

什么是纤程 Fibers?

Fibers 是 PHP 8.1 中引入的一个更新、更底层的概念。它们是轻量级的执行上下文,可以手动控制暂停和恢复。

与协程不同,Fibers 不依赖 yield`。它们使用 Fiber API 来显式挂起:

<?php$fiber = new Fiber(function (): void {echo "Start\n";Fiber::suspend("Paused");echo "Resume\n";
});
$value = $fiber->start();  // Start
echo $value . "\n";        // Paused
$fiber->resume();          // Resume

纤程让你对执行流程有完全的控制权。它们让你能写出看起来像同步但实际是异步的代码,而且不会被生成器的各种限制绊住。

流程图:

┌─────────────┐
│ 纤程开始     │
└──────┬──────┘│▼挂起 (手动)│▼恢复 (手动)│▼再次挂起 (可选)│▼纤程完成

协程 vs Fibers:关键区别

方面 协程 Fibers
概念来源 高级语言特性 底层基础组件
实现方式 yield Fiber 类
使用场景 异步 I/O、管道、迭代 事件循环、异步框架
控制权 调用者通过生成器 API 控制 Fibers 完全控制执行上下文
恢复能力 只能在 yield 处暂停 可以在函数的任意点挂起
限制 不能返回到任意点 更灵活和强大

简而言之:

  • 协程(生成器)为你提供迭代和类异步模式的便捷语法。
  • Fibers提供了在 PHP 中构建强大异步运行时的基础组件。

为什么这对 PHP 开发者很重要?

Fibers出现之前,PHP 没有一种干净利落的方式来处理异步工作流,只能用那些看起来很丑的回调链或者各种生成器的奇技淫巧。

有了Fibers,像 Amp v3, ReactPHP, webman(2.0 版本支持 Fibers 驱动了) 这样的库现在能让异步代码看起来像同步代码一样:

<?phpfunction fetchData(): string {// 假装这是异步 I/OFiber::suspend("Waiting for response...");return "Data received!";
}$fiber = new Fiber(fn() => fetchData());
echo $fiber->start(); // Waiting for response...
echo $fiber->resume(); // Data received!

这使得 PHP 在并发服务器、实时应用和高性能 API 方面成为更强的竞争者。

总结

协程和 Fibers 是相关的,但不是同一个东西:

  • 协程(通过生成器)是暂停和恢复函数的模式。
  • Fibers是实现结构化并发和现代异步运行时的底层基础组件。

把协程想象成菜谱,Fibers 想象成食材。有了 Fibers 这个食材,你可以做出协程这道菜——但反过来就不行了。

如果你现在在用异步 PHP,搞清楚这些区别能帮你为项目选对工具和框架。

👉 你怎么看——Fibers 会把 PHP 带入异步编程的新时代,还是协程依然会是大多数开发者的首选?

http://www.zskr.cn/news/10622.html

相关文章:

  • 详细介绍Seata的AT模式分布式事务
  • VMware VeloCloud 漏洞分析:未授权远程代码执行全链条攻破
  • HJ9 提取不重复的整数
  • PRISMS Junior Varsity Training 20250919
  • 为你的数据选择合适的分布:8个实用的概率分布应用场景和选择指南
  • 台风呢
  • 架设moon节点
  • 字符串哈希模板
  • Markdown基本与阿法
  • isEmpty/isNotEmpty/isNotBlank/isBlank-isAnyEmpty/isNoneEmpty/isAnyBlank/isNoneBlank
  • 牛客周赛 Round 110 E,F题解
  • 安装 elasticsearch-9.1.4 - 集群 和 kibana-9.1.4
  • 实测对比:权威榜单之公众号排版Top 5(含效果对比与适用建议)
  • 原码补码反码
  • C#学习1
  • 02020406 EF Core基础06-EF Core生成的SQL
  • 软工第一次编程
  • 从软件开发公司到用户体验设计公司:如何实现全链路数字化产品服务
  • 日志|力扣|不同路径|最小路径和|动态规划|Javase|IO|File|Javaweb
  • 如何建立 5 μm 精度的视觉检测?不仅仅是相机的事
  • 函数 cmd_info_change_cur_model_group
  • 线程--相关概念、两种创建线程的方式
  • 恢复某个数据文件不适当,导致DataGuard无法open数据库
  • 洛谷B4040 [GESP202409 四级] 黑白方块 题解
  • 代码随想录算法训练营第七天 |第454题.四数相加II、383. 赎金信、第15题. 三数之和
  • 9月23号
  • 第一次个人编程作业-论文查重
  • 差分电压
  • 【ChipIntelli 系列】ASR部分——合成语言模型和多网络(多语种)切换
  • dots.llm1:小红书开源的 MoE 架构大语言模型 - 实践