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 中执行排序与 MySQL 中排序
Apr 21 PHP
为IP查询添加GOOGLE地图功能的代码
Aug 08 PHP
PHP如何抛出异常处理错误
Mar 02 PHP
php数组的一些常见操作汇总
Jul 17 PHP
PHP empty函数报错解决办法
Mar 06 PHP
php中字符查找函数strpos、strrchr与strpbrk用法
Nov 18 PHP
PHP中使用imagick实现把PDF转成图片
Jan 26 PHP
Laravel 5.5基于内置的Auth模块实现前后台登陆详解
Dec 21 PHP
Laravel 加载第三方类库的方法
Apr 20 PHP
PHP常见字符串操作函数与用法总结
Mar 04 PHP
PHP实现cookie跨域session共享的方法分析
Aug 23 PHP
解决thinkPHP 5 nginx 部署时,只跳转首页的问题
Oct 16 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/09/16 PHP
CodeIgniter自定义控制器MY_Controller用法分析
2016/01/20 PHP
PHP观察者模式示例【Laravel框架中有用到】
2018/06/15 PHP
yii2实现Ueditor百度编辑器的示例代码
2018/11/02 PHP
微信小程序发送订阅消息的方法(php 为例)
2019/10/30 PHP
one.php 多项目、函数库、类库 统一为一个版本的方法
2020/08/24 PHP
js调用flash的效果代码
2008/04/26 Javascript
javascript错误的认识不用关心内存管理
2012/12/15 Javascript
Jquery 表单验证类介绍与实例
2013/06/09 Javascript
改变状态栏文字的js代码
2014/06/13 Javascript
jquery实现删除一个元素后面的所有元素功能
2015/12/21 Javascript
jQuery遍历DOM的父级元素、子级元素和同级元素的方法总结
2016/07/07 Javascript
canvas 画布在主流浏览器中的尺寸限制详细介绍
2016/12/15 Javascript
JavaScript数组复制详解
2017/02/02 Javascript
vue 如何添加全局函数或全局变量以及单页面的title设置总结
2017/06/01 Javascript
Nodejs回调加超时限制两种实现方法
2017/06/09 NodeJs
详解vue-cli + webpack 多页面实例配置优化方法
2017/07/13 Javascript
深入理解ES6之数据解构的用法
2018/01/13 Javascript
karma+webpack搭建vue单元测试环境的方法示例
2018/05/24 Javascript
如何让Nodejs支持H5 History模式(connect-history-api-fallback源码分析)
2019/05/30 NodeJs
vue实现图片懒加载的方法分析
2020/02/05 Javascript
使用nodejs实现JSON文件自动转Excel的工具(推荐)
2020/06/24 NodeJs
[52:06]完美世界DOTA2联赛决赛日 Inki vs LBZS 第一场 11.08
2020/11/10 DOTA
[05:37]DOTA2-DPC中国联赛 正赛 Elephant vs iG 选手采访
2021/03/11 DOTA
python读取注册表中值的方法
2013/04/08 Python
在Python中用has_key()方法查找键是否存在的教程
2015/05/21 Python
Python cookbook(数据结构与算法)在字典中将键映射到多个值上的方法
2018/02/18 Python
详解Python在使用JSON时需要注意的编码问题
2019/12/06 Python
python+playwright微软自动化工具的使用
2021/02/02 Python
美国最大的宠物药店:1-800-PetMeds
2016/10/02 全球购物
size?法国官网:英国伦敦的球鞋精品店
2020/03/15 全球购物
博士学位自我鉴定范文
2013/12/26 职场文书
给小学生的新年寄语
2014/04/04 职场文书
2014年文员工作总结
2014/11/18 职场文书
大学生党性分析材料
2014/12/19 职场文书
postgresql中如何执行sql文件
2023/05/08 PostgreSQL