2012-05-16 2 views
0

제가 만드는 프로세스는 비누 서비스에 데이터를 보내야합니다. 나는 바람직한 반응을 얻을 때까지 다음 행동을 진행할 수 없다.원하는 응답이 반환 될 때까지 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"값을 반환 할 때까지만 계속 진행하고 싶습니다. 이 작업을 수행하는 방법에 대한 제안 사항은 무엇입니까? 간단한 일만해도 충분합니까?

+1

do/while이 트릭을 수행해야합니다. 하지만 각 루프마다 지연을 가하는 것이 좋습니다. 그렇지 않으면 Soap 서버를 망치게됩니다. 또한 최대 시도 횟수를 지정하려고합니다. 프로그램을 무한 루프에 얽매이지 않으려 고합니다. – ben

+0

@ben, 답변으로 게시하여 크레딧을 수여 할 수 있습니까? 감사. – etm124

답변

0

트릭을해야합니다. 하지만 각 루프마다 지연을 가하는 것이 좋습니다. 그렇지 않으면 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; 
} 
관련 문제