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水印技术
Feb 14 PHP
php动态生成JavaScript代码
Mar 09 PHP
php cookie 登录验证示例代码
Mar 16 PHP
使用XDebug调试及单元测试覆盖率分析
Jan 27 PHP
解决phpmyadmin中缺少mysqli扩展问题的方法
May 06 PHP
PHP实现连接设备、通讯和发送命令的方法
Oct 13 PHP
理解PHP中的Session及对Session有效期的控制
Jan 08 PHP
PHP简单判断字符串是否包含另一个字符串的方法
Mar 25 PHP
php 实现进制相互转换
Apr 07 PHP
PHP实现的自定义数组排序函数与排序类示例
Nov 18 PHP
通过PHP设置BugFree获取邮箱通知
Apr 25 PHP
PHP调用接口API封装的例子
Oct 11 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中的函数-- foreach()的用法详解
2013/06/24 PHP
在JavaScript中实现命名空间
2006/11/23 Javascript
javascript 火狐(firefox)不显示本地图片问题解决
2008/07/05 Javascript
Javascript 函数中的参数使用分析
2010/03/27 Javascript
js的写法基础分析
2011/01/17 Javascript
让网页跳转到指定位置的jquery代码非书签
2013/09/06 Javascript
js中小数转换整数的方法
2014/01/26 Javascript
Javascript 实现复制(Copy)动作方法大全
2014/06/20 Javascript
JavaScript实现将数组中所有元素连接成一个字符串的方法
2015/04/06 Javascript
高性能JavaScript 重排与重绘(2)
2015/08/11 Javascript
Bootstrap模态对话框的简单使用
2016/04/29 Javascript
基于vue.js实现图片轮播效果
2016/12/01 Javascript
Angular 2.x学习教程之结构指令详解
2017/05/25 Javascript
元素全屏的设置与监听实例
2017/11/28 Javascript
vue 项目常用加载器及配置详解
2018/01/22 Javascript
vue引入js数字小键盘的实现代码
2018/05/14 Javascript
一步一步的了解webpack4的splitChunk插件(小结)
2018/09/17 Javascript
使用vue-cli4.0快速搭建一个项目的方法步骤
2019/12/04 Javascript
Vue移动端项目实现使用手机预览调试操作
2020/07/18 Javascript
Vue自动构建发布脚本的方法示例
2020/07/24 Javascript
vue 子组件watch监听不到prop的解决
2020/08/09 Javascript
vue 自定指令生成uuid滚动监听达到tab表格吸顶效果的代码
2020/09/16 Javascript
Python网络爬虫项目:内容提取器的定义
2016/10/25 Python
python matplotlib坐标轴设置的方法
2017/12/05 Python
tensorflow 输出权重到csv或txt的实例
2018/06/14 Python
Python定时任务APScheduler的实例实例详解
2019/07/22 Python
Python列表(list)所有元素的同一操作解析
2019/08/01 Python
在python中logger setlevel没有生效的解决
2020/02/21 Python
商务英语本科生的自我评价分享
2013/11/15 职场文书
公证书标准格式
2014/04/10 职场文书
2014年感恩母亲演讲稿
2014/05/27 职场文书
第二批党的群众路线教育实践活动总结报告
2014/10/30 职场文书
任命书标准格式
2015/03/02 职场文书
专家推荐信范文
2015/03/26 职场文书
我在伊朗长大观后感
2015/06/16 职场文书
浅谈Redis缓冲区机制
2022/06/05 Redis