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 相关文章推荐
一个简单的自动发送邮件系统(三)
Oct 09 PHP
第二节--PHP5 的对象模型
Nov 16 PHP
eWebEditor v3.8 商业完整版 (PHP)
Dec 06 PHP
PHP序列号生成函数和字符串替换函数代码
Jun 07 PHP
PHP实现把数字ID转字母ID
Aug 12 PHP
Smarty局部缓存的几种方法简介
Jun 17 PHP
PHP中对各种加密算法、Hash算法的速度测试对比代码
Jul 08 PHP
Centos下升级php5.2到php5.4全记录(编译安装)
Apr 03 PHP
Zend Framework使用Zend_Loader组件动态加载文件和类用法详解
Dec 09 PHP
PHP实现的激活用户注册验证邮箱功能示例
Jun 06 PHP
详解PHP中mb_strpos的使用
Feb 04 PHP
基于ThinkPHP5框架使用QueryList爬取并存入mysql数据库操作示例
May 25 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
DC四月将推出百页特刊漫画 纪念小丑诞生80周年
2020/04/09 欧美动漫
PHP Google的translate API代码
2008/12/10 PHP
php多任务程序实例解析
2014/07/19 PHP
mac系统下为 php 添加 pcntl 扩展
2016/08/28 PHP
javascript在一段文字中的光标处插入其他文字
2007/08/26 Javascript
jQuery ctrl+Enter shift+Enter实现代码
2010/02/07 Javascript
js实现从数组里随机获取元素
2015/01/12 Javascript
JS实现弹性漂浮效果的广告代码
2015/09/02 Javascript
JS+CSS实现仿支付宝菜单选中效果代码
2015/09/25 Javascript
JS数组排序方法实例分析
2016/12/16 Javascript
Vue实现选择城市功能
2017/05/27 Javascript
vue.js异步上传文件前后端实现代码
2017/08/22 Javascript
通俗解释JavaScript正则表达式快速记忆
2017/08/23 Javascript
layui中table表头样式修改方法
2018/08/15 Javascript
angular4+百分比进度显示插件用法示例
2019/05/05 Javascript
微信小程序和百度的语音识别接口详解
2019/05/06 Javascript
JS数组Object.keys()方法的使用示例
2019/06/05 Javascript
JavaScript实现HTML导航栏下拉菜单
2020/11/25 Javascript
[46:14]VGJ.T vs Liquid 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
[46:47]完美世界DOTA2联赛PWL S2 FTD vs Magma 第二场 11.20
2020/11/23 DOTA
详解在Python和IPython中使用Docker
2015/04/28 Python
基于python框架Scrapy爬取自己的博客内容过程详解
2019/08/05 Python
python matplotlib库直方图绘制详解
2019/08/10 Python
Python自动化操作实现图例绘制
2020/07/09 Python
详解用 python-docx 创建浮动图片
2021/01/24 Python
西班牙香水和化妆品网上商店:Douglas
2017/10/29 全球购物
英国在线药房和在线医生:LloydsPharmacy
2019/10/21 全球购物
Myprotein亚太地区:欧洲第一在线运动营养品牌
2020/12/20 全球购物
高三高考决心书
2014/03/11 职场文书
年度评优评先方案
2014/06/03 职场文书
公共场所禁烟标语
2014/06/25 职场文书
工伤事故赔偿协议书
2014/10/27 职场文书
教师党的群众路线教育实践活动学习笔记
2014/11/05 职场文书
2015教师个人工作总结范文
2015/03/31 职场文书
基于Python实现一个春节倒计时脚本
2022/01/22 Python
Apache POI操作批量导入MySQL数据库
2022/06/21 Servers