amphp 循环中使用Promise时yield无返回无报错问题求助
问题根因排查
- 核心问题:包含
yield关键字的download方法本质是PHP生成器,你没有将其交给Amp协程调度器执行,导致异步逻辑完全没有被运行,自然没有返回值也不会触发报错。 - 次要语法问题:构造分片对象的代码存在语法错误,
$path = $this->path."/".$i写法错误,会生成无效的对象属性键。 - 冗余代码问题:代码中声明的
$app、$_this变量未被使用,@return void的注释声明错误,使用协程的方法实际返回Promise对象。
修复步骤
- 修正调用逻辑
你在Loop::run中调用download方法时,必须用\Amp\call包装生成器,交给Amp调度执行,示例调用代码如下:
\Amp\Loop::run(function () use ($downloadInstance) { // 包装download生成器为协程执行 yield \Amp\call([$downloadInstance, 'download']); });
- 修正分片构造语法错误
将原有错误的分片对象创建代码:
$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 ];
- 修正方法注释与冗余代码
删除未使用的$app、$_this变量,将方法注释的返回值声明改为:
/** * Start Download * * @return \Amp\Promise */
修复完成后即可正常执行批量分片请求,每个批次的Promise执行完成后才会进入下一批次循环。
内容的提问来源于stack exchange,提问作者Giacomo Tüfekci
相关产品推荐
相关产品推荐

