在特定条件下重做最后的foreach循环指令
我们正在向web服务发出1000次请求。每次我们提出请求时,我们都会期待响应,但有时web服务会失败并且不会提供响应。发生这种情况时,我们想睡30秒,然后在失败的最后一点重新运行该循环。如何才能做到这一点?在特定条件下重做最后的foreach循环指令
这里的基本结构:
foreach ($objects as $object) {
foreach ($otherObjects as $otherObject) {
//Prepare request data from $object and $otherObjects
//Send request to webservice using cURL
//Receive response and check to see if success
if (isset($response)) {
//Save response to database
} else {
//Not successful. Sleep for 30 seconds. Send request again up to 3 times. If ultimately successful continue, if not break and alert system admin.
}
}
}
你可能关中断请求到一个函数:
foreach ($objects as $object) {
foreach ($otherObjects as $otherObject) {
$tries = 0;
//Receive response and check to see if success.
while(($response = doRequest($object, $otherObject)) === false && $tries < 3) {
//Not successful. Sleep for 30 seconds. Send request again up to 3 times.
$tries++;
sleep(30);
}
if ($response) {
//Successful save response to database.
} else {
//Not successful break and alert system admin.
}
}
function doRequest($object, $otherObject) {
//Prepare request data from $object and $otherObject.
//Send request to webservice using cURL.
return $result;
}
foreach ($objects as $object) {
foreach ($otherObjects as $otherObject) {
//Prepare request data from $object and $otherObjects
//Send request to webservice using cURL
//Receive response and check to see if success
if (isset($response)) {
//Save response to database
} else {
$retriesLeft = 3;
do {
sleep(30);
// perform the request again
--$retriesLeft;
}
while (!isset($response) && $retriesLeft);
}
}
}
更新:简体版
foreach ($objects as $object) {
foreach ($otherObjects as $otherObject) {
$retriesLeft = 4;
//Prepare request data from $object and $otherObjects
do {
//Send request to webservice using cURL
//Receive response and check to see if success
if (isset($response)) {
break;
}
else {
sleep(30);
--$retriesLeft;
}
}
while (!isset($response) && $retriesLeft);
}
}
但我怎么重新运行失败的web服务请求?基本上,回去并重做内存中的最后一个循环并继续? – TimNguyenBSM 2015-03-31 20:58:45
刚刚更新到你如何做到这一点。如果你需要更多的信息,你可以提供更多关于你想要做的事情,因为没有很多信息可以继续。 – 2015-03-31 21:03:51
Thx,这有助于。您是否简单地将请求数据存储在$ failedRequests中,然后在1000个请求的末尾,通过$ failedRequests循环并重试? – TimNguyenBSM 2015-03-31 21:08:56
邦纳的回答也很好,但我选择了这个答案,因为逻辑流动性更好,并且更直观易懂。 – TimNguyenBSM 2015-03-31 22:57:21