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

amphp 循环中使用Promise时yield无返回无报错问题求助

问题根因排查

  • 核心问题:包含yield关键字的download方法本质是PHP生成器,你没有将其交给Amp协程调度器执行,导致异步逻辑完全没有被运行,自然没有返回值也不会触发报错。
  • 次要语法问题:构造分片对象的代码存在语法错误,$path = $this->path."/".$i写法错误,会生成无效的对象属性键。
  • 冗余代码问题:代码中声明的$app、$_this变量未被使用,@return void的注释声明错误,使用协程的方法实际返回Promise对象。

修复步骤

  1. 修正调用逻辑
    你在Loop::run中调用download方法时,必须用\Amp\call包装生成器,交给Amp调度执行,示例调用代码如下:
\Amp\Loop::run(function () use ($downloadInstance) {
    // 包装download生成器为协程执行
    yield \Amp\call([$downloadInstance, 'download']);
});
  1. 修正分片构造语法错误
    将原有错误的分片对象创建代码:
$chunks[] = (object) ['id' => ($i+1), 'start'=>$start , 'end'=>$end, $path = $this->path."/".$i];

修改为正确写法:

$chunks[] = (object) [
    'id' => ($i + 1), 
    'start' => $start, 
    'end' => $end, 
    'path' => $this->path . "/" . $i
];
  1. 修正方法注释与冗余代码
    删除未使用的$app、$_this变量,将方法注释的返回值声明改为:
/**
 * Start Download
 * 
 * @return \Amp\Promise
 */

修复完成后即可正常执行批量分片请求,每个批次的Promise执行完成后才会进入下一批次循环。

内容的提问来源于stack exchange,提问作者Giacomo Tüfekci

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 09:45:07