当前位置: 首页 > news >正文

php中curl和soap方式请求服务超时问题

公司中有不少服务是以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捕获请求超时和连接超时的方法。

相关文章:

  • 8月25日
  • 冒泡排序和选择排序流程图
  • 域帐号密码过期邮件提醒
  • 一个html,3D 标签 鼓励自己
  • 阿里云大数据MaxCompute基于UDTF解析JSON日志的案例
  • The connection to adb is down, and a severe error has occured. 错误
  • 一文带你了解 LSM Compaction
  • 里氏替换原则
  • UI设计不就是画线框,凭什么年薪30W?
  • 彻底解决乱码
  • 我的微软最有价值专家(Microsoft MVP)之路
  • 如何向Android模拟器打电话发短信
  • 【奥斯卡理财星体系 序篇】为什么你需要学习这个理财体系?
  • 基于阿里云快速搭建数字营销引擎【计算广告】
  • wcf深入学习笔记
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • 3.7、@ResponseBody 和 @RestController
  • conda常用的命令
  • Elasticsearch 参考指南(升级前重新索引)
  • ES6核心特性
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • Java知识点总结(JavaIO-打印流)
  • js学习笔记
  • ng6--错误信息小结(持续更新)
  • Vultr 教程目录
  • Zsh 开发指南(第十四篇 文件读写)
  • 从零开始学习部署
  • 前端_面试
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • Mac 上flink的安装与启动
  • 选择阿里云数据库HBase版十大理由
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • #14vue3生成表单并跳转到外部地址的方式
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • #NOIP 2014#day.2 T1 无限网络发射器选址
  • (2.2w字)前端单元测试之Jest详解篇
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (六)软件测试分工
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • ***监测系统的构建(chkrootkit )
  • *上位机的定义
  • .NET Core WebAPI中使用Log4net 日志级别分类并记录到数据库
  • .NET Core 中插件式开发实现
  • .net framework4与其client profile版本的区别
  • .NET 设计一套高性能的弱事件机制
  • .NET 事件模型教程(二)
  • .net图片验证码生成、点击刷新及验证输入是否正确
  • /deep/和 >>>以及 ::v-deep 三者的区别
  • @require_PUTNameError: name ‘require_PUT‘ is not defined 解决方法
  • [ element-ui:table ] 设置table中某些行数据禁止被选中,通过selectable 定义方法解决