我有以下代码:
$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 的某些内容发生了变化,因此可能会出现无限循环。
修复是这样的:
$client = new GuzzleHttpClient(['timeout' => 2.0]);
下次我应该提供整个代码,也许有人会发现这一点。谢谢你们。
最可能的解释是,你的代码实际上并没有达到你的中断,因为计数器每次迭代都会递增,但你只检查正好 20 当它不是实际页面时 应更改以下代码以更改此问题:
if($counter >= 20) {
break;
}
目前你的代码看起来有点复杂。您可以通过以下方式简化它:
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++;
}
}
从外观上看,你只有在 ($counter == 20 && !$xml 时才会中断。如果该条件不成立,您永远不会前进$currentPage,因此循环将永远卡住。
为清楚起见,请编辑: 当$xml是假的时,$counter很可能已经过了 20,这意味着$currentPage没有前进(所以你的 while 条件仍然是真的),但由于$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++;
}