微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php中curl和soap方式请求服务超时问题的解决

公司中有不少服务是以curl或者soap方式连接第三方公司做的服务来交互数据,最近新增加了个需求,就是第三方服务发版时候,连接不上对方服务器时候要进行重试,其它原因导致的业务处理失败,则按失败处理,不会再进行调用

思路就是判断curl或者soap连接不上对方服务器时候,抛出TimeoutException异常,捕获后做重试处理,其它错误导致的抛出的Exception则按失败处理。

curl处理

true,CURLOPT_CONNECTTIMEOUT => 5,//5秒连接时间 CURLOPT_TIMEOUT => 30,//30秒请求等待时间 );
curl_s<a href="https://www.jb51.cc/tag/eto/" target="_blank" class="keywords">eto</a>pt_array($ch,$options);
$response = curl_exec($ch);
if ($no = curl_errno($ch)) {
  $error = curl_error($ch);
  curl_close($ch);
  //$no<a href="https://www.jb51.cc/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的源码发现,还是有定义的

PHP文件位置 /ext/soap/PHP_http.c

定义错误代码内容

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_<a href="https://www.jb51.cc/tag/dis/" target="_blank" class="keywords">dis</a>able_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, 用这个来判断

以上为PHP使用soap和curl捕获请求超时和连接超时的方法。希望对大家的学习有所帮助,也希望大家多多支持编程之家。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐