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下MAIL的另一解决方案
Oct 09 PHP
模拟flock实现文件锁定
Feb 14 PHP
PHP常用函数小技巧
Sep 11 PHP
php 论坛采集程序 模拟登陆,抓取页面 实现代码
Jul 09 PHP
php 验证码制作(网树注释思想)
Jul 20 PHP
php模板原理讲解
Nov 13 PHP
PHP获取网页标题的3种实现方法代码实例
Apr 11 PHP
PHP开启opcache提升代码性能
Apr 26 PHP
php实现比较两个文件夹异同的方法
Jun 18 PHP
php通过curl添加cookie伪造登陆抓取数据的方法
Apr 02 PHP
[原创]PHP正则匹配中英文、数字及下划线的方法【用户名验证】
Aug 01 PHP
php写入txt乱码的解决方法
Sep 17 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
在线短消息收发的程序,不用数据库
2006/10/09 PHP
php图像处理函数大全(推荐收藏)
2013/07/11 PHP
解决PHP里大量数据循环时内存耗尽的方法
2015/10/10 PHP
用js实现判断当前网址的来路如果不是指定的来路就跳转到指定页面
2011/05/02 Javascript
js判断鼠标同时离开两个div的思路及代码
2013/05/31 Javascript
js call方法详细介绍(js 的继承)
2013/11/18 Javascript
JS中把字符转成ASCII值的函数示例代码
2013/11/21 Javascript
JS连连看源码完美注释版(推荐)
2013/12/09 Javascript
jQuery 重复加载错误以及修复方法
2014/12/16 Javascript
jQuery中:visible选择器用法实例
2014/12/30 Javascript
JS实现获取键盘按下的按键并显示在页面上的方法
2015/11/04 Javascript
JavaScript实现数据类型的相互转换
2016/03/06 Javascript
html中鼠标滚轮事件onmousewheel的处理方法
2016/11/11 Javascript
js实现文字选中分享功能
2017/01/25 Javascript
jQuery复合事件结合toggle()方法的用法示例
2017/06/10 jQuery
使用vue + less 实现简单换肤功能的示例
2018/02/21 Javascript
快速了解vue-cli 3.0 新特性
2018/02/28 Javascript
javascript与PHP动态往类中添加方法对比
2018/03/21 Javascript
Vue中使用vux配置代码详解
2018/09/16 Javascript
vscode下vue项目中eslint的使用方法
2019/01/13 Javascript
详解基于mpvue微信小程序下载远程图片到本地解决思路
2019/05/16 Javascript
解决vue单页面应用中动态修改title问题
2019/06/09 Javascript
使用vue-router在Vue页面之间传递数据的方法
2019/07/15 Javascript
Element Dropdown下拉菜单的使用方法
2020/07/26 Javascript
python判断给定的字符串是否是有效日期的方法
2015/05/13 Python
python爬虫框架scrapy实战之爬取京东商城进阶篇
2017/04/24 Python
使用Python+Splinter自动刷新抢12306火车票
2018/01/03 Python
python3读取excel文件只提取某些行某些列的值方法
2018/07/10 Python
pygame游戏之旅 调用按钮实现游戏开始功能
2018/11/21 Python
代码实例讲解python3的编码问题
2019/07/08 Python
python实现按首字母分类查找功能
2019/10/31 Python
pytorch程序异常后删除占用的显存操作
2020/01/13 Python
Tripadvisor新西兰:阅读评论,比较价格和酒店预订
2018/02/10 全球购物
导游词之岳阳楼
2019/09/25 职场文书
MIME类型中application/xml与text/xml的区别介绍
2022/01/18 HTML / CSS
使用python将HTML转换为PDF pdfkit包(wkhtmltopdf) 的使用方法
2022/04/21 Python