公司中有不少服务是以curl或者soap方式连接第三方公司做的服务来交互数据,最近新增加了个需求,就是第三方服务发版时候,连接不上对方服务器时候要进行重试,其它原因导致的业务处理失败,则按失败处理,不会再进行调用。
思路就是判断curl或者soap连接不上对方服务器时候,抛出TimeoutException异常,捕获后做重试处理,其它错误导致的抛出的Exception则按失败处理。
curl处理
curl_setopt_array($ch,$options);
$response = curl_exec($ch);
if ($no = curl_errno($ch)) {
$error = curl_error($ch);
curl_close($ch);
//$no<a href="/tag/cuowu/" target="_blank" class="keywords">错误</a>码7为连接不上,28为连接上了但请求返回结果超时
if(in_array(intval($no),[7,28],true)) {
throw new TimeoutException('连接或请求超时' . $error,$no);
}
}
curl_close($ch);
soap处理
PHP文档并没详细写soap超时或者连接不上返回的具体代码,业务处理失败或者连接不上等所有不成功,都会抛出一个SoapFault异常,看了下PHP的源码发现,还是有定义的
add_soap_fault(this_ptr,"HTTP","Unable to parse URL",NULL,NULL); add_soap_fault(this_ptr,"Unknown protocol. Only http and https are allowed.","SSL support is not available in this build","Could not connect to host","Failed Sending HTTP SOAP request","Failed to create stream??","Error Fetching http headers","Error Fetching http body,No Content-Length,connection closed or chunked data","Redirection limit reached,aborting","Didn't receive an xml document",err); add_soap_fault(this_ptr,"Unknown Content-Encoding","Can't uncompress compressed response",http_msg,NULL);
从代码里可以看出来,连接不上都会返回一个HTTP码,soap并没像curl那样有具体的代码可以区分二者,只利用这个码可以判断是超时或者连接不上等网络问题
具体代码如下
try {
$options = array(
'cache_wsdl' => 0,'connection_timeout' => 5,//定义连接超时为5秒
);
libxml_disable_entity_loader(false);
$client = new \SoapClient($url,$options);
return $client->__soapCall($function_name,$arguments);
} catch (\SoapFault $e) {
//超时、连接不上
if($e->faultcode == 'HTTP'){
throw new TimeoutException('连接或请求超时',$e->getCode());
}
}
可以连接上soap服务,但客户端或者服务端出问题 $e->faultcode 会返回WSDL, 用这个来判断