2012-05-16 2 views
0

Le processus que je crée doit envoyer des données à un service de soap. Je ne peux pas procéder à ma prochaine action avant d'avoir obtenu une réponse souhaitable.Exécuter l'appel API jusqu'à ce que la réponse souhaitée soit renvoyée

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

Dans la pièce au-dessus du code, j'exécuter la méthode BulkLoadContacts. Je prends alors le ProcessID de la réponse. Une fois que j'ai cette identification, je fais un autre appel pour obtenir le statut de mon processus. Le dernier dumper me dit la réponse de GetProcessStatus. Le dumper ressemble à:

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" 
    } 
} 

Le dernier élément est Status. Seulement jusqu'à ce que la méthode retourne avec la valeur de "ProcessingCompleted" je veux continuer. Des suggestions sur la façon d'accomplir cela? Un simple do-while serait-il suffisant?

+1

Un do/while devrait faire l'affaire. Mais je recommande de mettre un retard dans chaque boucle, sinon vous serez marteler le serveur de savon. Aussi, vous voulez probablement spécifier un nombre maximum d'essais. Vous ne voulez pas que votre programme soit bloqué dans une boucle infinie. – ben

+0

@ben, pourriez-vous poster ceci comme une réponse afin que je puisse vous accorder un crédit? Merci. – etm124

Répondre

0

Un do/while devrait faire l'affaire. Mais je recommande de mettre un retard dans chaque boucle, sinon vous serez marteler le serveur de savon.

De même, vous souhaiterez probablement spécifier un nombre maximal d'essais. Vous ne voulez pas que votre programme soit bloqué dans une boucle infinie.

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; 
} 
Questions connexes