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

简介: 协程是可暂停的函数,PHP通过yield实现;Fibers是PHP 8.1+的轻量执行单元,可手动控制执行流程。协程适用于异步I/O,Fibers更灵活,为异步框架提供底层支持,让PHP能写出同步风格的异步代码,提升并发性能。(239字)

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

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

<?php

function 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 驱动了) 这样的库现在能让异步代码看起来像同步代码一样:https://github.com/yjndsrt/cn/issues/2882

<?php

function fetchData(): string {
// 假装这是异步 I/O
Fiber::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,搞清楚这些区别能帮你为项目选对工具和框架。

目录
相关文章
|
PHP 调度 开发者
探索PHP新特性:协程编程的崛起
PHP作为一种流行的服务器端脚本语言,近年来不断发展壮大。本文将重点探讨PHP中新兴的技术领域——协程编程,介绍其原理、优势以及在实际项目中的应用场景,帮助读者更好地理解并运用这一技术。
|
18天前
|
设计模式 安全 PHP
PHP 5与PHP 7的主要区别分析
综上所述,PHP 7相比于PHP 5,不仅在性能上有显著提升,还增加了许多新特性和改进,使得PHP语言更加强大和现代化。同时,弃用了一些过时的特性和函数,更加注重代码的健壯性和安全性。然而,这些改变也意味着从PHP 5迁移到PHP 7可能需要一些代码的调整和优化。
109 10
|
8月前
|
存储 PHP
PHP中如何定义常量以及常量和变量的主要区别
常量和变量在PHP中扮演着不同的角色,各有各的应用场景。常量用于存储不会改变的值,具有全局作用域,定义后在整个脚本中都可以访问。变量则用于存储在程序执行过程中可能改变的值,作用域可以是局部的或全局的。掌握常量和变量的定义和区别,有助于编写出更加清晰、可维护的代码。希望本文能帮助你更好地理解和使用PHP中的常量和变量。
158 20
|
Go 调度 开发者
[go 面试] 深入理解进程、线程和协程的概念及区别
[go 面试] 深入理解进程、线程和协程的概念及区别
|
分布式计算 JavaScript 前端开发
多线程、多进程、协程的概念、区别与联系
多线程、多进程、协程的概念、区别与联系
319 1
ly~
|
安全 Java 大数据
php跟java有什么区别
PHP 和 Java 是两种常用编程语言,各有特色。PHP 语法简洁灵活,适用于快速开发中小型网站,尤其在 Web 脚本和数据库交互中表现出色。Java 则语法严谨,强类型特性使其在企业级应用、移动开发及大数据处理中更受欢迎,具备高稳定性和安全性。通过优化,PHP 性能可提升,而 Java 在大规模应用中表现更佳。总体而言,PHP 开发效率高但维护性稍差,Java 则更注重代码质量和安全性。
ly~
463 5
|
SQL 关系型数据库 数据库连接
php连接数据库之PDO,PDO的简单使用和预定义占位符的使用以及PDOStatement对象的使用,占位符的不同形式,bindValue和bindParam绑定预定义占位符参数的区别
本文介绍了PHP中PDO(PHP Data Objects)扩展的基本概念和使用方法。内容包括PDO类和PDOStatement类的介绍,PDO的简单使用,预定义占位符的使用方法,以及PDOStatement对象的使用。文章还讨论了绑定预定义占位符参数的不同形式,即bindValue和bindParam的区别。通过具体示例,展示了如何使用PDO进行数据库连接、数据查询、数据插入等操作。
php连接数据库之PDO,PDO的简单使用和预定义占位符的使用以及PDOStatement对象的使用,占位符的不同形式,bindValue和bindParam绑定预定义占位符参数的区别
|
PHP
PHP &&是什么,||是什么,&&和||有什么区别?
PHP &&是什么,||是什么,&&和||有什么区别?
240 1
|
PHP 数据库 开发者
探索PHP中的协程:生成器与异步编程
在PHP的世界中,协程的概念虽然不像在Python等语言中那样广为人知,但它的存在为异步编程带来了新的可能。本文将深入探讨PHP中的协程概念,特别是生成器(Generators)如何实现协程模式,以及这一机制如何被应用于异步编程,从而提升PHP应用的性能与响应能力。我们将通过实例和代码示例,展示如何利用这些特性来构建更加高效、非阻塞的PHP应用程序。
|
API 数据处理 PHP
探索PHP中的协程:现代Web开发的新范式
在PHP的众多创新中,协程作为一种新兴的异步编程模型,正逐渐改变我们对PHP性能和效率的认知。本文将深入探讨PHP中的协程概念,它如何优化并发处理,以及在实际开发中的应用案例与性能考量。
179 0