当 PHP 8.1 引入 Fibers 时,许多开发人员想知道它们是否可以解决 PHP 作为单线程同步语言的长期限制。 Fibers 能否使 PHP 变得异步,就像带有事件循环的 JavaScript 或 Node.js 一样?答案很微妙:纤程不提供真正的异步执行,但它们是更有效地管理任务的强大工具。让我们详细探讨这个概念。
Fibers 是 PHP 中实现协作多任务的机制。它们允许您暂停和恢复代码的特定部分,而不会阻塞整个 PHP 进程。将 Fiber 视为一种特殊功能,可以将控制权“让渡”回主程序,然后在收到请求时从中断处继续执行。
当使用 Fiber::suspend() 暂停 Fiber 时,控制返回到主 PHP 脚本。这意味着:
例如:
$fiber = new Fiber(function () { echo "Fiber started\n"; Fiber::suspend(); echo "Fiber resumed\n"; }); echo "Before Fiber\n"; $fiber->start(); echo "After Fiber Start\n"; $fiber->resume(); echo "After Fiber Resume\n"; Output:
Before Fiber Fiber started After Fiber Start Fiber resumed After Fiber Resume
这是发生的事情:
是的,但只是暂时的。当您调用 Fiber::resume() 时,Fiber 在主 PHP 进程中同步运行。在此期间:
$fiber = new Fiber(function () { echo "Processing Fiber...\n"; sleep(2); // Simulates a blocking task echo "Fiber Done\n"; }); echo "Before Fiber\n"; $fiber->start(); echo "Between Fiber Start and Resume\n"; $fiber->resume(); echo "After Fiber\n"; Output:
Before Fiber Processing Fiber... Fiber Done Between Fiber Start and Resume After Fiber
这里,Fiber 在 sleep(2) 调用期间阻塞了主进程。因此,虽然 Fiber 提供了一种构建代码以提高效率的方法,但它们并不能神奇地实现并行或真正的异步执行。
术语“非阻塞”是指 Fiber 如何实现更好的任务管理,而不是并行执行。 Fiber 在暂停时不会阻塞主进程;相反,控制权被交还给主脚本或事件循环。
这对于使用事件驱动架构的库或框架特别有用,例如 ReactPHP 或 Amp,其中:
想象你是一位厨师,正在准备多种菜肴:
您开始烹饪菜肴,但停下来等待食物沸腾。
在等待的同时,你开始准备另一道菜。
当第一道菜准备好后,您可以返回并继续烹饪。
类似地,Fibers 允许 PHP “暂停”任务并稍后返回该任务,而不会中断整个过程。
与 JavaScript 或 Node.js 中的异步编程不同,任务可以使用线程或事件循环并行运行,Fibers:
换句话说:
纤维不会引入并行性(任务仍然一次运行一个)。
它们是更有效地管理和构建非阻塞代码的工具。
虽然 PHP Fibers 并未使 PHP 真正实现异步,但它们是该语言的强大补充。
以上是什么是 PHP 纤维? PHP Fiber 真的可以异步执行吗?的详细内容。更多信息请关注PHP中文网其他相关文章!