php中curl和soap方式请求服务超时问题的解决
发布:smiling 来源: PHP粉丝网 添加日期:2021-09-25 16:10:12 浏览: 评论:0
本篇文章主要介绍了php中curl和soap方式请求服务超时问题的解决,小编觉得挺不错的,现在分享给大家,也给大家做个参考,一起跟随小编过来看看吧。
公司中有不少服务是以curl或者soap方式连接第三方公司做的服务来交互数据,最近新增加了个需求,就是第三方服务发版时候,连接不上对方服务器时候要进行重试,其它原因导致的业务处理失败,则按失败处理,不会再进行调用。
思路就是判断curl或者soap连接不上对方服务器时候,抛出TimeoutException异常,捕获后做重试处理,其它错误导致的抛出的Exception则按失败处理。
curl处理
- $ch = curl_init($url);
- $options = array(
- CURLOPT_RETURNTRANSFER => true,
- CURLOPT_CONNECTTIMEOUT => 5, //5秒连接时间
- CURLOPT_TIMEOUT => 30, //30秒请求等待时间
- );
- curl_setopt_array($ch, $options);
- $response = curl_exec($ch);
- if ($no = curl_errno($ch)) {
- $error = curl_error($ch);
- curl_close($ch);
- //$no错误码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, "HTTP", "Unknown protocol. Only http and https are allowed.", NULL, NULL);
- add_soap_fault(this_ptr, "HTTP", "SSL support is not available in this build", NULL, NULL);
- add_soap_fault(this_ptr, "HTTP", "Could not connect to host", NULL, NULL);
- add_soap_fault(this_ptr, "HTTP", "Failed Sending HTTP SOAP request", NULL, NULL);
- add_soap_fault(this_ptr, "HTTP", "Failed to create stream??", NULL, NULL);
- add_soap_fault(this_ptr, "HTTP", "Error Fetching http headers", NULL, NULL);
- add_soap_fault(this_ptr, "HTTP", "Error Fetching http body, No Content-Length, connection closed or chunked data", NULL, NULL);
- add_soap_fault(this_ptr, "HTTP", "Redirection limit reached, aborting", NULL, NULL);
- add_soap_fault(this_ptr, "HTTP", "Didn't receive an xml document", NULL, err);
- add_soap_fault(this_ptr, "HTTP", "Unknown Content-Encoding", NULL, NULL);
- add_soap_fault(this_ptr, "HTTP", "Can't uncompress compressed response", NULL, NULL);
- add_soap_fault(this_ptr, "HTTP", http_msg, NULL, NULL);
从代码里可以看出来,连接不上都会返回一个HTTP码,soap并没像curl那样有具体的代码可以区分二者,只利用这个码可以判断是超时或者连接不上等网络问题
具体代码如下
- ini_set('default_socket_timeout', 30); //定义响应超时为30秒
- 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, 用这个来判断。
Tags: curl soap
相关文章
- ·php curl常见错误:SSL错误、bool(false)(2013-11-30)
- ·curl out of memory window下PHP调用curl报内存不够(2013-12-06)
- ·windows 下 php curl 的支持配置方法(2013-12-06)
- ·PHP 利用curl_init发起http请求模仿登录(2014-01-06)
- ·php curl 伪造IP来源程序实现代码(2014-01-07)
- ·php curl 分离header和body信息(2014-01-07)
- ·PHP curl 获取响应的状态实例(2014-01-08)
- ·php curl模块模拟登录后采集页面实例(2014-01-08)
- ·PHP Curl多线程实现原理与实例详解(2014-01-09)
- ·Drupal 通过cURL Post方式发送一个文件(2014-01-10)
- ·php 通过curl post发送json数据实例(2014-01-10)
- ·php用Curl伪造客户端源IP(2014-01-10)
- ·php利用CURL函数登入163邮箱并获取自己的通讯录(2014-06-17)
- ·php中CURL实现多线程的笔记(2014-06-18)
- ·PHP利用Curl模拟登录并获取数据例子(2014-06-21)
- ·php中curl模拟登陆用户百度知道的例子(2014-06-29)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)