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
PHP新手入门学习方法
May 08 PHP
JS与PHP向函数传递可变参数的区别实例代码
May 18 PHP
PHP备份数据库生成SQL文件并下载的函数代码
Feb 05 PHP
php 深入理解strtotime函数的使用详解
May 23 PHP
yii操作session实例简介
Jul 31 PHP
php基于base64解码图片与加密图片还原实例
Nov 03 PHP
ThinkPHP模板输出display用法分析
Nov 26 PHP
分享五个PHP7性能优化提升技巧
Dec 07 PHP
PHP简单获取多个checkbox值的方法
Jun 13 PHP
使用Codeigniter重写insert的方法(推荐)
Mar 23 PHP
HTTP头隐藏PHP版本号实现过程解析
Dec 09 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
中国第一家无线电行
2021/03/01 无线电
php+xml编程之SimpleXML的应用实例
2015/01/24 PHP
PHP实现链式操作的三种方法详解
2017/11/16 PHP
超级简单的图片防盗(HTML),好用
2007/04/08 Javascript
List the Codec Files on a Computer
2007/06/11 Javascript
javascript URL编码和解码使用说明
2010/04/12 Javascript
基于jquery的点击链接插入链接内容的代码
2012/07/31 Javascript
node.js中的console.time方法使用说明
2014/12/09 Javascript
JS中Eval解析JSON字符串的一个小问题
2016/02/21 Javascript
js 上传文件预览的简单实例
2016/08/16 Javascript
微信小程序 教程之事件
2016/10/18 Javascript
微信公众号  提示:Unauthorized API function 问题解决方法
2016/12/05 Javascript
利用iscroll4实现轮播图效果实例代码
2017/01/11 Javascript
JavaScript制作简易计算器(不用eval)
2017/02/05 Javascript
利用JavaScript对中文(汉字)进行排序实例详解
2017/06/18 Javascript
微信小程序项目总结之记账小程序功能的实现(包括后端)
2019/08/20 Javascript
vue data引入本地图片的两种方式小结
2019/11/13 Javascript
JS实现网站楼层导航效果代码实例
2020/06/16 Javascript
基于Cesium绘制抛物弧线
2020/11/18 Javascript
用javascript实现倒计时效果
2021/02/09 Javascript
python学习教程之Numpy和Pandas的使用
2017/09/11 Python
Python通过命令开启http.server服务器的方法
2017/11/04 Python
Java编程迭代地删除文件夹及其下的所有文件实例
2018/02/10 Python
python+selenium 鼠标事件操作方法
2019/08/24 Python
详解H5本地储存Web Storage
2017/07/03 HTML / CSS
惠普加拿大在线商店:HP加拿大
2017/09/15 全球购物
美国渔具店:FishUSA
2019/08/07 全球购物
参观考察邀请函范文
2014/01/29 职场文书
大学生简短的自我评价分享
2014/02/20 职场文书
英语教育专业自荐信
2014/05/29 职场文书
用人单位终止解除劳动合同证明书
2014/10/06 职场文书
幼师求职自荐信
2015/03/26 职场文书
党性修养心得体会2016
2016/01/21 职场文书
大学校园餐饮创业计划书
2019/08/07 职场文书
MySQL 分组查询的优化方法
2021/05/12 MySQL
MySQL数据库中的锁、解锁以及删除事务
2022/05/06 MySQL