PHP While loop永远不会完成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循环,网站再次运行。现在的问题是,有时页面加载,有时不加载。

当它没有时,脚本会持续很长时间,以至于有多个客户端,服务器崩溃,我必须手动重新启动 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++;
}

最新更新