2012-05-16 30 views
0

我创建的过程需要将数据发送到soap服务。我不能继续我的下一个行动,直到我得到理想的回应。执行API调用,直到返回所需的响应

try { 
    $return = $soapClient->__soapCall("BulkLoadContacts",array('parameter' => $params)); 

    foreach ($return as $r){ 
     $upload_id = $r; 
    } 

    $process_params = array(
     'ProcessID' => $upload_id, 
    ); 
    $return = $soapClient->__soapCall("GetProcessStatus",array('parameter' => $process_params)); 
    var_dump($return); 

} 
catch(SoapFault $fault){ 
    $status = false; 
} 

在上面这段代码中,我执行BulkLoadContacts方法。然后我从响应中获取ProcessID。一旦我有了这个ID,我就再打一次电话来获得我的过程状态。最后一辆自卸车告诉我GetProcessStatus的回应。翻斗车看起来像:

object(stdClass)#18 (1) { 
    ["WSProcessStatus"]=> 
    object(stdClass)#19 (6) { 
    ["ProcessID"]=> 
    int(3313881) 
    ["ListID"]=> 
    int(268207) 
    ["ProcessName"]=> 
    string(20) "listrak_tempfile.txt" 
    ["ProcessStartTime"]=> 
    string(23) "2012-05-16T14:22:50.643" 
    ["ProcessCompleteTime"]=> 
    string(22) "2012-05-16T14:22:50.84" 
    ["Status"]=> 
    string(19) "ProcessingCompleted" 
    } 
} 

最后一项是Status。只有在方法返回值为“ProcessingCompleted”时,我才会继续。有关如何完成此任务的任何建议?一个简单的do-while就足够了吗?

+1

A do/while should do the trick。但是我建议在每个循环中放一段延迟,否则你会锤击Soap服务器。此外,您可能想要指定最大尝试次数。你不想让程序陷入无限循环。 – ben

+0

@ben,你可以发布这个答案,所以我可以授予你信用?谢谢。 – etm124

回答

0

A do/while should do the truncate。但是我建议在每个循环中放一段延迟,否则你会锤击Soap服务器。

另外,您可能要指定最大尝试次数。你不想让程序陷入无限循环。

try { 
    $return = $soapClient->__soapCall("BulkLoadContacts",array('parameter' => $params)); 

    foreach ($return as $r){ 
     $upload_id = $r; 
    } 

    $attempts_remaining = 10; 
    do { 
     sleep(1); 
     $process_params = array(
      'ProcessID' => $upload_id, 
     ); 
     $return = $soapClient->__soapCall("GetProcessStatus",array('parameter' => $process_params)); 

     $attempts_remaining--; 
    } while (($return->WSProcessStatus->Status != 'ProcessingCompleted') && ($attempts_remaining > 0)); 

    if($return->WSProcessStatus->Status == 'ProcessingCompleted') { 
     //success 
    } 
    else { 
     //timeout 
    } 


} 
catch(SoapFault $fault){ 
    $status = false; 
} 
相关问题