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 20 PHP
在windows服务器开启php的gd库phpinfo中未发现
Jan 13 PHP
探讨php中防止SQL注入最好的方法是什么
Jun 10 PHP
如何在smarty中增加类似foreach的功能自动加载数据
Jun 26 PHP
php对二维数组进行排序的简单实例
Dec 19 PHP
神盾加密解密教程(二)PHP 神盾解密
Jun 08 PHP
yii2整合百度编辑器umeditor及umeditor图片上传问题的解决办法
Apr 20 PHP
Yii框架防止sql注入,xss攻击与csrf攻击的方法
Oct 18 PHP
php 判断字符串编码是utf-8 或gb2312实例
Nov 01 PHP
php自定义时间转换函数示例
Dec 07 PHP
利用php获得flv视频长度的实例代码
Oct 26 PHP
PHP pthreads v3下同步处理synchronized用法示例
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
最简单的PHP程序--记数器
2006/10/09 PHP
php中判断字符串是否全是中文或含有中文的实现代码
2011/09/16 PHP
php 利用array_slice函数获取随机数组或前几条数据
2015/09/30 PHP
WordPress中用于获取文章作者与分类信息的方法整理
2015/12/17 PHP
浅谈PHP中类和对象的相关函数
2017/04/26 PHP
拖拉表格的JS函数
2008/11/20 Javascript
jQuery 版元素拖拽原型代码
2011/04/25 Javascript
jquery动态增加删除表格行的小例子
2013/11/14 Javascript
js实现省市联动效果的简单实例
2014/02/10 Javascript
使用JavaScript制作一个简单的计数器的方法
2015/07/07 Javascript
浅析C/C++,Java,PHP,JavaScript,Json数组、对象赋值时最后一个元素后面是否可以带逗号
2016/03/22 Javascript
JS实现动态修改table及合并单元格的方法示例
2017/02/20 Javascript
Vue2.0 从零开始_环境搭建操作步骤
2017/06/14 Javascript
js实现京东轮播图效果
2017/06/30 Javascript
NodeJS使用七牛云存储上传文件的方法
2017/07/24 NodeJs
AngularJS使用ng-repeat遍历二维数组元素的方法详解
2017/11/11 Javascript
微信小程序模板template简单用法示例
2018/12/04 Javascript
什么时候不能在 Node.js 中使用 Lock Files
2019/06/24 Javascript
Vue v-text指令简单使用方法示例
2019/09/19 Javascript
Javascript Dom元素获取和添加详解
2019/09/24 Javascript
在Vue里如何把网页的数据导出到Excel的方法
2020/09/30 Javascript
Python中的自省(反射)详解
2015/06/02 Python
Python之reload流程实例代码解析
2018/01/29 Python
python绘制双Y轴折线图以及单Y轴双变量柱状图的实例
2019/07/08 Python
python 执行终端/控制台命令的例子
2019/07/12 Python
简单易懂Pytorch实战实例VGG深度网络
2019/08/27 Python
python sorted函数原理解析及练习
2020/02/10 Python
美国彩妆品牌:Coastal Scents
2017/04/01 全球购物
开普敦通行证:Cape Town Pass
2019/07/18 全球购物
LN-CC日本:高端男装和女装的奢侈时尚目的地
2019/09/01 全球购物
工作自我评价分享
2013/12/01 职场文书
手机被没收检讨书
2014/02/22 职场文书
公务员政审单位鉴定材料
2014/05/16 职场文书
浪漫的婚礼主持词
2015/06/30 职场文书
毕业酒会致辞
2015/07/29 职场文书
oracle数据库去除重复数据
2022/05/20 Oracle