纖程

纖程概述

(PHP 8 >= 8.1.0)

纖程(Fiber)表示一組有完整棧、可中斷的功能。 纖程可以在調(diào)用堆棧中的任何位置被掛起,在纖程內(nèi)暫停執(zhí)行,直到稍后恢復(fù)。

纖程可以暫停整個(gè)執(zhí)行堆棧,所以該函數(shù)的直接調(diào)用者不需要改變調(diào)用這個(gè)函數(shù)的方式。

你可以在調(diào)用堆棧的任意地方使用 Fiber::suspend() 中斷執(zhí)行(也就是說,Fiber::suspend() 的調(diào)用位置可以在一個(gè)深度嵌套的函數(shù)中,甚至可以不存在)。

與無棧的 Generator 不同, 每一個(gè) Fiber 擁有自己的調(diào)用棧,并允許在一個(gè)深度前度的函數(shù)調(diào)用中將它們暫停。 聲明了中斷(interruption)點(diǎn)的函數(shù)(即調(diào)用 Fiber::suspend()) 不需要改變自己的返回類型,不像使用 yield 一樣需要返回一個(gè) Generator 實(shí)例。

纖程可以在任意函數(shù)調(diào)用中被暫停,包括那些在 PHP VM 中被調(diào)用的函數(shù)。 例如被用于 array_map() 的函數(shù)或者提供 Iterator 實(shí)例以被 foreach 調(diào)用的方法。

纖程一旦被暫停,可以使用 Fiber::resume() 傳遞任意值、或者使用 Fiber::throw() 向纖程拋出一個(gè)異常以恢復(fù)運(yùn)行。這個(gè)值或者異常將會(huì)在 Fiber::suspend() 中被返回(拋出)。

示例 #1 基礎(chǔ)用法

<?php
$fiber 
= new Fiber(function (): void {
   
$value Fiber::suspend('fiber');
   echo 
"Value used to resume fiber: "$valuePHP_EOL;
});

$value $fiber->start();

echo 
"Value from fiber suspending: "$valuePHP_EOL;

$fiber->resume('test');
?>

以上例程會(huì)輸出:

Value from fiber suspending: fiber
Value used to resume fiber: test