首页 文章

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

提问于
浏览
0

我有以下代码:

$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循环,网站再次工作 . 现在问题是,有时页面加载,有时它不加载 .

如果脚本没有持续这么长时间,那么对于多个客户端,服务器崩溃,我必须手动重启apache .

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

编辑:

我发现了错误,它甚至不是我的while循环(尽管计数器<= 20的修复也是如此) . 这是关于guzzle,它使“runOperation”背后的请求 . 我不得不定义一个超时,因为我不知道为什么,但似乎亚马逊产品API的某些东西发生了变化,所以在guzzle中可能存在无限循环 .

修复是这样的:

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

我下次应该提供整个代码,也许有人会发现这个 . 感谢你们 .

3 回答

  • 1

    最可能的解释是你的代码实际上没有达到你的休息时间,因为计数器在每次迭代时都会增加,但是当它不是实际页面时你只检查20个以下代码应该改变以改变这个问题:

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

    目前你的代码看起来有点复杂 . 您可以通过以下方式简化它:

    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++;
        }
    }
    
  • 1

    从它的外观来看,你只是打破了($ counter == 20 &&!$ xml) . 如果那个条件不成立,你永远不会推进$ currentPage,所以循环将永远停滞 .

    编辑为清晰:它's likely that $counter has passed 20 by the time that $xml is falsy, which means $currentPage isn' t推进(所以你的条件仍然是真的)但因为$ counter大于20,你的休息不会被击中 . 将 $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++;
    }
    

相关问题