我正在创建的流程需要将数据发送到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”之前,我才能继续。有关如何完成此任务的任何建议?一个简单的做法是否足够?
答案 0 :(得分: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;
}