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++;
}
}
我有以下代码:
$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++;
}
}