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下删除字符串中HTML标签的函数
Aug 27 PHP
php 生成文字png图片的代码
Apr 17 PHP
需要注意的几个PHP漏洞小结
Feb 05 PHP
解析thinkphp import 文件内容变量失效的问题
Jun 20 PHP
PHP中spl_autoload_register函数的用法总结
Nov 07 PHP
PHP常用编译参数中文说明
Sep 27 PHP
PHP实现过滤掉非汉字字符只保留中文字符
Jun 04 PHP
PHP使用ODBC连接数据库的方法
Jul 18 PHP
PHP闭包函数详解
Feb 13 PHP
THINKPHP在添加数据的时候获取主键id的值方法
Apr 03 PHP
PHP实现合并两个排序链表的方法
Jan 19 PHP
Laravel5.1框架注册中间件的三种场景详解
Jul 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
PHP生成图片验证码、点击切换实例
2014/06/25 PHP
thinkphp模板赋值与替换实例简述
2014/11/24 PHP
php获取json数据所有的节点路径
2015/05/17 PHP
Zend Framework处理Json数据方法详解
2016/12/09 PHP
yii2 在控制器中验证请求参数的使用方法
2019/06/19 PHP
javascript中的作用域scope介绍
2010/12/28 Javascript
js两行代码按指定格式输出日期时间
2011/10/21 Javascript
采用call方式实现js继承
2014/05/20 Javascript
js实现文本框选中的方法
2015/05/26 Javascript
Angularjs中$http以post请求通过消息体传递参数的实现方法
2016/08/05 Javascript
微信小程序 WebSocket详解及应用
2017/01/21 Javascript
浅谈js停止事件冒泡 阻止浏览器的默认行为(阻止超连接 #)
2017/02/08 Javascript
Vue之Watcher源码解析(1)
2017/07/19 Javascript
在vue项目中正确使用iconfont的方法
2018/09/28 Javascript
详解Ant Design of React的安装和使用方法
2018/12/27 Javascript
CKeditor4 字体颜色功能配置方法教程
2019/06/26 Javascript
js实现内置计时器
2019/12/16 Javascript
Vue实现PC端靠边悬浮球的代码
2020/05/09 Javascript
Vue Router中应用中间件的方法
2020/08/06 Javascript
win7 下搭建sublime的python开发环境的配置方法
2014/06/18 Python
python中pycurl库的用法实例
2014/09/30 Python
基于python脚本实现软件的注册功能(机器码+注册码机制)
2016/10/09 Python
关于numpy数组轴的使用详解
2019/12/05 Python
Python实现LR1文法的完整实例代码
2020/10/25 Python
ASOS比利时:英国线上零售商及自有品牌
2018/07/29 全球购物
最好的商品表达自己:Cafepress
2019/09/04 全球购物
俄罗斯游戏商店:Buka
2020/03/01 全球购物
小区门卫工作职责
2013/12/14 职场文书
《三亚落日》教学反思
2014/04/26 职场文书
酒店员工培训方案
2014/06/02 职场文书
2014保险公司个人工作总结
2014/12/09 职场文书
政协委员个人总结
2015/03/03 职场文书
2015教师年度思想工作总结
2015/04/30 职场文书
医院见习总结
2015/06/24 职场文书
2015年秋季运动会广播稿
2015/08/19 职场文书
有趣的二维码:使用MyQR和qrcode来制作二维码
2021/05/10 Python