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


Posted in PHP onJune 11, 2018

公司中有不少服务是以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, 用这个来判断

以上为php使用soap和curl捕获请求超时和连接超时的方法。希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
用Php实现链结人气统计
Oct 09 PHP
eWebEditor v3.8 商业完整版 (PHP)
Dec 06 PHP
IIS+PHP+MySQL+Zend配置 (视频教程)
Dec 13 PHP
php Smarty模板生成html文档的方法
Apr 12 PHP
php中3des加密代码(完全与.net中的兼容)
Aug 02 PHP
php ckeditor上传图片文件名乱码解决方法
Nov 15 PHP
php中chdir()函数用法实例
Nov 13 PHP
浅析php创建者模式
Nov 25 PHP
PHP弹出对话框技巧详细解读
Sep 26 PHP
PHP批量获取网页中所有固定种子链接的方法
Nov 18 PHP
php自定义截取中文字符串-utf8版
Feb 27 PHP
PHP+jQuery实现双击修改table表格功能示例
Feb 21 PHP
Laravel框架模板继承操作示例
Jun 11 #PHP
Laravel框架模板加载,分配变量及简单路由功能示例
Jun 11 #PHP
Laravel框架在本地虚拟机快速安装的方法详解
Jun 11 #PHP
thinkPHP5框架中widget的功能与用法详解
Jun 11 #PHP
thinkPHP5框架自定义验证器实现方法分析
Jun 11 #PHP
PHP绕过open_basedir限制操作文件的方法
Jun 10 #PHP
PHPMailer ThinkPHP实现自动发送邮件功能
Jun 10 #PHP
You might like
德劲1103的维修打理经验
2021/03/02 无线电
360通用php防护代码(使用操作详解)
2013/06/18 PHP
如何让搜索引擎抓取AJAX内容解决方案
2014/08/25 PHP
php对文件夹进行相关操作(遍历、计算大小)
2015/11/04 PHP
Yii2使用表单上传文件的实例代码
2017/08/03 PHP
PHP使用微信开发模式实现搜索已发送图文及匹配关键字回复的方法
2017/09/13 PHP
实现复选框全选/全不选切换
2006/12/23 Javascript
Prototype Selector对象学习
2009/07/23 Javascript
JavaScript 学习初步 入门教程
2010/03/25 Javascript
时间戳转换为时间 年月日时间的JS函数
2013/08/19 Javascript
jQuery中extend函数详解
2015/02/13 Javascript
利用JS实现简单的日期选择插件
2017/01/23 Javascript
微信小程序上传图片实例
2018/05/28 Javascript
Vue使用NProgress的操作过程解析
2019/10/10 Javascript
js实现点赞效果
2020/03/16 Javascript
vue+iview框架实现左侧动态菜单功能的示例代码
2020/07/23 Javascript
基于vue--key值的特殊用处详解
2020/07/31 Javascript
Python中List.count()方法的使用教程
2015/05/20 Python
解析Python中的__getitem__专有方法
2016/06/27 Python
使用Python进行二进制文件读写的简单方法(推荐)
2016/09/12 Python
让python 3支持mysqldb的解决方法
2017/02/14 Python
详解Python核心对象类型字符串
2018/02/11 Python
Python爬虫常用小技巧之设置代理IP
2018/09/13 Python
python中数字是否为可变类型
2020/07/08 Python
CSS3实现多样的边框效果
2018/05/04 HTML / CSS
百联网上商城:i百联
2017/01/28 全球购物
Origins悦木之源香港官网:雅诗兰黛集团高端植物护肤品牌
2018/03/21 全球购物
英国领先的在线高尔夫商店:Gamola Golf
2019/11/16 全球购物
New Balance比利时官方网站:购买鞋子和服装
2021/01/15 全球购物
小学教师的个人自我鉴定
2013/10/24 职场文书
初中生自我评价
2014/02/01 职场文书
学院党委班子四风问题自查报告及整改措施
2014/10/25 职场文书
奖学金个人总结
2015/03/04 职场文书
我是特种兵观后感
2015/06/11 职场文书
安全教育第一课观后感
2015/06/17 职场文书
SONY AN-LP1 短波有源天线放大器
2021/04/22 无线电