PHP While 循环永远不会完成亚马逊产品 API / APAIO?

PHP While loop never finishes Amazon Product API / APAIO?

我有以下代码:

$counter = 0;

while($currentPage <= $pages) {
    sleep(0.1);
    flush();
    $browseNodeLookup->setPage($currentPage);
    try {
        $xml = $apaiIO->runOperation($browseNodeLookup);
    } catch(Exception $e1) {
        if($counter == 20) {
            break;
        }
    }
    if($xml) {
        $all_elements =  iq_parse_data($xml, $itemcount, $all_elements);
        $currentPage++;
    } else {
        if($counter == 20) {
            break;
        }
    }
    $counter++;
}

到现在它看起来已经有点奇怪了,因为我无法让 while 循环中断。问题是,我的网站突然(我自己没有做任何更改)崩溃了。我所做的只是删除 while 循环,网站再次运行。现在的问题是,有时页面会加载,有时却不会。

如果脚本不继续运行很长时间,以至于有多个客户端,服务器就会崩溃,我必须手动重新启动 apache。

这个while循环有什么问题吗?我错过了什么吗?

编辑:

我发现了错误,这甚至与我的 while 循环无关(尽管 counter <= 20 的修复也是正确的)。是关于 guzzle 的,这使得 "runOperation" 后面的请求。我不得不定义一个超时,因为我不知道为什么,但似乎 Amazon Product API 发生了一些变化,因此 guzzle 中可能会出现无限循环。

修复是这样的:

$client = new \GuzzleHttp\Client(['timeout'  => 2.0]);

下次我应该提供完整的代码,也许有人会发现这一点。谢谢大家。

最可能的解释是您的代码实际上并没有中断,因为计数器在每次迭代时都会递增,但您只是在它不是实际页面时检查恰好 20 应更改以下代码以更改此问题:

  if($counter >= 20) {
    break;
  }

从表面上看,您只有在 ($counter == 20 && !$xml) 时才会崩溃。如果该条件不成立,您永远不会推进 $currentPage,因此循环将永远卡住。

为清楚起见编辑: 到 $xml 为假时 $counter 可能已经超过 20,这意味着 $currentPage 没有前进(所以你的 while 条件仍然为真)但是因为 $counter 大于 20,你的 break 确实不被击中。将 $counter == 20 更改为 $counter >= 20

此外,如果您只想继续前进,直到达到 20 或 $totalPages(以较低者为准),您的代码可以简化为

$pages = min(20, $pages);

while ($currentPage <= $pages) {
    sleep(0.1);
    flush();

    $browseNodeLookup->setPage($currentPage);

    try {
        $xml = $apaiIO->runOperation($browseNodeLookup);
        $all_elements = iq_parse_data($xml, $itemcount, $all_elements);
    } catch (Exception $e1) {
        // Any error handling you want to do
    }

    $currentPage++;
}

目前您的代码看起来有点复杂。你可以这样简化它:

while($currentPage <= $pages) {
    sleep(0.1);
    flush();
    $browseNodeLookup->setPage($currentPage);

    try {
        $xml = $apaiIO->runOperation($browseNodeLookup);
        $all_elements =  iq_parse_data($xml, $itemcount, $all_elements);
    } finally {
        $currentPage++;
    }
}