我有以下代码:
$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 回答
最可能的解释是你的代码实际上没有达到你的休息时间,因为计数器在每次迭代时都会增加,但是当它不是实际页面时你只检查20个以下代码应该改变以改变这个问题:
目前你的代码看起来有点复杂 . 您可以通过以下方式简化它:
从它的外观来看,你只是打破了($ 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,以较低者为准,你的代码可以简化为类似