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 相关文章推荐
基于mysql的bbs设计(三)
Oct 09 PHP
php下利用curl判断远程文件是否存在的实现代码
Oct 08 PHP
PHP查询数据库中满足条件的记录条数(两种实现方法)
Jan 29 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(八)
Jun 23 PHP
PHP生成不重复标识符的方法
Nov 21 PHP
php动态函数调用方法
May 21 PHP
PHP使用php-resque库配合Redis实现MQ消息队列的教程
Jun 29 PHP
php版微信公众平台接口开发之智能回复开发教程
Sep 22 PHP
PHP实现生成模糊图片的方法示例
Dec 21 PHP
laravel5.5添加echarts实现画图功能的方法
Oct 09 PHP
PHP论坛实现积分系统的思路代码详解
Jun 01 PHP
php远程请求CURL实例教程(爬虫、保存登录状态)
Dec 10 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过滤危险html代码的函数
2008/07/22 PHP
基于PHP array数组的教程详解
2013/06/05 PHP
编译php 5.2.14+fpm+memcached(具体操作详解)
2013/06/18 PHP
微信自定义分享php代码分析
2016/11/24 PHP
thinkPHP5实现数据库添加内容的方法
2017/10/25 PHP
css把超出的部分显示为省略号的方法兼容火狐
2008/07/23 Javascript
js可突破windows弹退效果代码
2008/08/09 Javascript
JavaScript 变量基础知识
2009/11/07 Javascript
HTA版JSMin(省略修饰语若干)基于javascript语言编写
2009/12/24 Javascript
利用google提供的API(JavaScript接口)获取网站访问者IP地理位置的代码详解
2010/07/24 Javascript
JavaScript中创建类/对象的几种方法总结
2013/11/29 Javascript
gridview生成时如何去掉style属性中的border-collapse
2014/09/30 Javascript
3kb jQuery代码搞定各种树形选择的实现方法
2016/06/10 Javascript
巧方法 JavaScript获取超链接的绝对URL地址
2016/06/14 Javascript
js 判断附件后缀的简单实现方法
2016/10/11 Javascript
vue实现ToDoList简单实例
2017/02/07 Javascript
Javascript封装id、class与元素选择器方法示例
2017/03/13 Javascript
Jquery中.bind()、.live()、.delegate()和.on()之间的区别详解
2017/08/01 jQuery
vue页面使用阿里oss上传功能的实例(二)
2017/08/09 Javascript
基于Require.js使用方法(总结)
2017/10/26 Javascript
vue二级路由设置方法
2018/02/09 Javascript
微信小程序自定义底部弹出框
2020/11/16 Javascript
angular 表单验证器验证的同时限制输入的实现
2019/04/11 Javascript
python基础教程之缩进介绍
2014/08/29 Python
Python网站验证码识别
2016/01/25 Python
Python中规范定义命名空间的一些建议
2016/06/04 Python
Django实现的自定义访问日志模块示例
2017/06/23 Python
使用Python快速制作可视化报表的方法
2019/02/03 Python
python使用正则表达式(Regular Expression)方法超详细
2019/12/30 Python
python mysql 字段与关键字冲突的解决方式
2020/03/02 Python
毕业生的自我鉴定
2013/10/29 职场文书
房屋认购协议书
2015/01/29 职场文书
2015年街道除四害工作总结
2015/05/15 职场文书
公司保洁员管理制度
2015/08/04 职场文书
新年祝酒词大全
2015/08/11 职场文书
2016庆祝国庆67周年宣传语
2015/11/25 职场文书