I'm trying to make some simple fibers work, but doesn't seem to go as expected. What am I missing here? Have never worked with fibers before
The output I expected:
iteration: 0
Fiber 1 is working!
Fiber 2 is working!
Fiber 3 is working (0)!
(1 sec sleep)
iteration: 1
Fiber 1 is working!
Fiber 2 is working!
Fiber 3 is working (1)!
(1 sec sleep)
iteration: 2
Fiber 1 is working!
Fiber 2 is working!
Fiber 3 completed!
(1 sec sleep)
iteration: 3
Fiber 1 is working!
Fiber 2 is working!
(1 sec sleep)
...
code
$fibers = [];
// add fiber 1
fiber_await(new \Fiber(function(){
while(true){
echo "Fiber 1 is working!\n";
\Fiber::suspend();
}
}));
// add fiber 2
fiber_await(new \Fiber(function(){
while(true){
echo "Fiber 2 is working!\n";
\Fiber::suspend();
}
}));
// add fiber 3
fiber_await(new \Fiber(function(){
for($i=0; $i<2; $i++){
echo "Fiber 3 is working ($i)!\n";
\Fiber::suspend();
}
echo "Fiber 3 completed!\n";
}));
$j = 0;
foreach($fibers as $i => &$pair){
echo "iteration: $j\n";
$parent = $pair[0];
if($parent->isTerminated()){
unset($fibers[$i]);
}
elseif($parent->isSuspended()){
$parent->resume();
}
sleep(1);
$j++;
}
function fiber_await(\Fiber $child): mixed{
$fibers[] = [\Fiber::getCurrent(), $child];
$child->start();
while(!$child->isTerminated()){
$child->resume();
\Fiber::suspend();
}
return $child->getReturn();
}
output
Fiber 1 is working!
Fiber 1 is working!
Fatal error: Uncaught FiberError: Cannot suspend outside of a fiber in Standard input code:46
Stack trace:
#0 Standard input code(46): Fiber::suspend()
#1 Standard input code(12): fiber_await(Object(Fiber))
#2 {main}
thrown in Standard input code on line 46