2015-03-31 43 views
-1

我们正在向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. 
     } 
    } 
} 

回答

1

你可能关中断请求到一个函数:

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; 
} 
+0

邦纳的回答也很好,但我选择了这个答案,因为逻辑流动性更好,并且更直观易懂。 – TimNguyenBSM 2015-03-31 22:57:21

2
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); 
    } 
} 
+0

但我怎么重新运行失败的web服务请求?基本上,回去并重做内存中的最后一个循环并继续? – TimNguyenBSM 2015-03-31 20:58:45

+0

刚刚更新到你如何做到这一点。如果你需要更多的信息,你可以提供更多关于你想要做的事情,因为没有很多信息可以继续。 – 2015-03-31 21:03:51

+0

Thx,这有助于。您是否简单地将请求数据存储在$ failedRequests中,然后在1000个请求的末尾,通过$ failedRequests循环并重试? – TimNguyenBSM 2015-03-31 21:08:56