纖程

纖程概述

(PHP 8 >= 8.1.0)

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

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

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

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

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

纖程一旦被暫停,可以使用 Fiber::resume() 傳遞任意值、或者使用 Fiber::throw() 向纖程拋出一個異常以恢復(fù)運行。這個值或者異常將會在 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');
?>

以上例程會輸出:

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