You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 16:22:19