(PHP 8 >= 8.1.0)
纖程(Fiber)表示一組有完整棧、可中斷的功能。 纖程可以在調用堆棧中的任何位置被掛起,在纖程內暫停執行,直到稍后恢復。
纖程可以暫停整個(gè)執行堆棧,所以該函數的直接調用者不需要改變調用這個(gè)函數的方式。
你可以在調用堆棧的任意地方使用 Fiber::suspend() 中斷執行(也就是說(shuō),Fiber::suspend() 的調用位置可以在一個(gè)深度嵌套的函數中,甚至可以不存在)。
與無(wú)棧的 Generator 不同, 每一個(gè) Fiber 擁有自己的調用棧,并允許在一個(gè)深度前度的函數調用中將它們暫停。 聲明了中斷(interruption)點(diǎn)的函數(即調用 Fiber::suspend()) 不需要改變自己的返回類(lèi)型,不像使用 yield 一樣需要返回一個(gè) Generator 實(shí)例。
纖程可以在任意函數調用中被暫停,包括那些在 PHP VM 中被調用的函數。 例如被用于 array_map() 的函數或者提供 Iterator 實(shí)例以被 foreach 調用的方法。
纖程一旦被暫停,可以使用 Fiber::resume() 傳遞任意值、或者使用 Fiber::throw() 向纖程拋出一個(gè)異常以恢復運行。這個(gè)值或者異常將會(huì )在 Fiber::suspend() 中被返回(拋出)。
示例 #1 基礎用法
<?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');
?>
以上例程會(huì )輸出:
Value from fiber suspending: fiber Value used to resume fiber: test