2015-03-31 45 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