(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: ", $value, PHP_EOL;
});
$value = $fiber->start();
echo "Value from fiber suspending: ", $value, PHP_EOL;
$fiber->resume('test');
?>
以上例程會輸出:
Value from fiber suspending: fiber Value used to resume fiber: test