PHP 8.2中Fiber调用resume返回空值问题求助
PHP 8.2 Fiber返回空值问题分析与解决
问题原因
调用$fiber->start()时,Fiber会立即执行内部逻辑直到遇到Fiber::suspend($val),此时start()方法的返回值就是传入suspend的$val。后续调用$fiber->resume()时,由于Fiber在suspend之后没有可执行的代码,resume()会返回null,这就是结果数组全为空的核心原因。
解决方法
方法一:启动Fiber时直接捕获返回值
既然start()会返回suspend传入的值,直接在启动阶段收集结果即可:
<?php $data = ["A","B","C"]; $results = []; foreach ($data as $val) { $fiber = new Fiber(function () use ($val): void { Fiber::suspend($val); }); // 捕获start()的返回值,即suspend传入的$val $results[] = $fiber->start(); } print_r($results); ?>
运行后输出符合预期:
Array ( [0] => A [1] => B [2] => C )
方法二:调整Fiber逻辑让resume返回值
如果需要通过resume()获取结果,可以修改Fiber内部逻辑,在resume()恢复执行后返回目标值:
<?php $data = ["A","B","C"]; $fibers = []; foreach ($data as $val) { $fiber = new Fiber(function () use ($val) { // 暂停时传递$val,resume恢复后返回$val Fiber::suspend($val); return $val; }); $fiber->start(); $fibers[] = $fiber; } $results = []; foreach ($fibers as $fiber) { $results[] = $fiber->resume(); } print_r($results); ?>
这种方式下,resume()会返回Fiber执行完毕时的返回值,同样能得到预期结果。
内容的提问来源于stack exchange,提问作者Rasid
相关产品推荐
相关产品推荐

