0

私が作成しているプロセスは、SOAP サービスにデータを送信する必要があります。望ましい反応が得られるまで、次の行動に進むことができません。

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 で十分でしょうか?

4

1 に答える 1

0

do/while でうまくいくはずです。ただし、各ループに遅延を設定することをお勧めします。そうしないと、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;
}
于 2012-05-17T17:46:37.607 に答える