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不允许用户提交空表单(php空值判断)
Nov 12 PHP
PHP中file_exists函数不支持中文名的解决方法
Jul 26 PHP
访问编码后的中文URL返回404错误的解决方法
Aug 20 PHP
php图片处理函数获取类型及扩展名实例
Nov 19 PHP
如何使用PHP Embed SAPI实现Opcodes查看器
Nov 10 PHP
php 时间time与日期date之间的使用详解及区别
Nov 07 PHP
PHP获取IP地址所在地信息的实例(使用纯真IP数据库qqwry.dat)
Nov 15 PHP
php 魔术常量详解及实例代码
Dec 04 PHP
Laravel5.4框架中视图共享数据的方法详解
Sep 05 PHP
Thinkphp5.0 框架Model模型简单用法分析
Oct 11 PHP
laravel框架与其他框架的详细对比
Oct 23 PHP
open_basedir restriction in effect. 原因与解决方法
Mar 14 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数组对百万数据进行排除重复数据的实现代码
2010/06/08 PHP
thinkphp备份数据库的方法分享
2015/01/04 PHP
php中fsockopen用法实例
2015/01/05 PHP
JavaScript写的一个自定义弹出式对话框代码
2010/01/17 Javascript
用jquery与css打造个性化的单选框和复选框
2010/10/20 Javascript
jQuery学习笔记(3)--用jquery(插件)实现多选项卡功能
2013/04/08 Javascript
jquery中.add()的使用分析
2013/04/26 Javascript
使用iframe window的scroll方法控制iframe页面滚动
2014/03/05 Javascript
JavaScript匿名函数与委托使用示例
2014/07/22 Javascript
你所不了解的javascript操作DOM的细节知识点(一)
2015/06/17 Javascript
JS对大量数据进行多重过滤的方法
2016/11/04 Javascript
angular2+nodejs实现图片上传功能
2017/03/27 NodeJs
JavaScript实现三级联动菜单实例代码
2017/06/26 Javascript
微信小程序 蓝牙的实现实例代码
2017/06/27 Javascript
vuex中遇到的坑,vuex数据改变,组件中页面不渲染操作
2020/11/16 Javascript
[01:15]PWL S2开团时刻第二期——他们杀 我就白给
2020/11/25 DOTA
Django URL传递参数的方法总结
2016/08/28 Python
Python GUI Tkinter简单实现个性签名设计
2018/06/19 Python
python中update的基本使用方法详解
2019/07/17 Python
Selenium python时间控件输入问题解决方案
2020/07/22 Python
Pycharm plot独立窗口显示的操作
2020/12/11 Python
关于canvas.toDataURL 在iOS运行失败的问题解决
2020/09/16 HTML / CSS
大学学年自我鉴定
2013/10/28 职场文书
大四本科生的自我评价
2013/12/30 职场文书
2014年九一八事变演讲稿
2014/09/14 职场文书
党员个人对照检查材料范文
2014/09/24 职场文书
2015年健康教育工作总结
2015/04/10 职场文书
入党积极分子党小组意见
2015/06/02 职场文书
2015年教师国培感言
2015/08/01 职场文书
2015年秋学期师德师风建设工作总结
2015/10/23 职场文书
python自动化测试通过日志3分钟定位bug
2021/11/20 Python
python套接字socket通信
2022/04/01 Python
CentOS7和8下安装Maven3.8.4
2022/04/07 Servers
GO语言异常处理分析 err接口及defer延迟
2022/04/14 Golang
MySQL慢查询中的commit慢和binlog中慢事务的区别
2022/06/16 MySQL
java实现web实时消息推送的七种方案
2022/07/23 Java/Android