成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

php中curl和soap方式請求服務(wù)超時(shí)問題

Apollo / 2377人閱讀

摘要:公司中有不少服務(wù)是以或者方式連接第三方公司做的服務(wù)來交互數(shù)據(jù),最近新增加了個需求,就是第三方服務(wù)發(fā)版時(shí)候,連接不上對方服務(wù)器時(shí)候要進(jìn)行重試,其它原因?qū)е碌臉I(yè)務(wù)處理失敗,則按失敗處理,不會再進(jìn)行調(diào)用。

公司中有不少服務(wù)是以curl或者soap方式連接第三方公司做的服務(wù)來交互數(shù)據(jù),最近新增加了個需求,就是第三方服務(wù)發(fā)版時(shí)候,連接不上對方服務(wù)器時(shí)候要進(jìn)行重試,其它原因?qū)е碌臉I(yè)務(wù)處理失敗,則按失敗處理,不會再進(jìn)行調(diào)用。
思路就是判斷curl或者soap連接不上對方服務(wù)器時(shí)候,拋出TimeoutException異常,捕獲后做重試處理,其它錯誤導(dǎo)致的拋出的Exception則按失敗處理。

curl處理

    $ch = curl_init($url);
        $options = array(
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_CONNECTTIMEOUT => 5,  //5秒連接時(shí)間
            CURLOPT_TIMEOUT        => 30, //30秒請求等待時(shí)間
        );
       
        curl_setopt_array($ch, $options);
        $response = curl_exec($ch);
        if ($no = curl_errno($ch)) {
            $error = curl_error($ch);
            curl_close($ch);
            //$no錯誤碼7為連接不上,28為連接上了但請求返回結(jié)果超時(shí)
            if(in_array(intval($no), [7, 28], true)) {
                throw new TimeoutException("連接或請求超時(shí)" . $error, $no);
            }
        }
        curl_close($ch);

soap處理

php文檔并沒詳細(xì)寫soap超時(shí)或者連接不上返回的具體代碼,業(yè)務(wù)處理失敗或者連接不上等所有不成功,都會拋出一個SoapFault異常,看了下php的源碼發(fā)現(xiàn),還是有定義的

php源文件位置 /ext/soap/php_http.c 
定義錯誤代碼內(nèi)容
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那樣有具體的代碼可以區(qū)分二者,只利用這個碼可以判斷是超時(shí)或者連接不上等網(wǎng)絡(luò)問題
具體代碼如下

ini_set("default_socket_timeout", 30); //定義響應(yīng)超時(shí)為30秒

        try {
            $options = array(
                "cache_wsdl" => 0,
                "connection_timeout" => 5, //定義連接超時(shí)為5秒
            );
            libxml_disable_entity_loader(false);
            $client = new SoapClient($url, $options);
            return $client->__soapCall($function_name, $arguments);

        } catch (SoapFault $e) {
            //超時(shí)、連接不上
            if($e->faultcode == "HTTP"){
                throw new TimeoutException("連接或請求超時(shí)", $e->getCode());
            }
        }

可以連接上soap服務(wù),但客戶端或者服務(wù)端出問題 $e->faultcode 會返回WSDL, 用這個來判斷

以上為php使用soap和curl捕獲請求超時(shí)和連接超時(shí)的方法。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/28797.html

相關(guān)文章

  • 學(xué)習(xí) PHP SOAP 擴(kuò)展的一些筆記

    摘要:對的相關(guān)學(xué)習(xí)就先告此一段落,這是最后一篇文章用來記錄下學(xué)習(xí)過程中的一些筆記和心得。對,沒錯在還沒有提供擴(kuò)展前,的確很多人也是這樣做的??偨Y(jié)上面都是自己在學(xué)習(xí)擴(kuò)展時(shí)的一些零散的筆記,如果有不對的地方,希望大家指出,謝謝。 對 SOAP 的相關(guān)學(xué)習(xí)就先告此一段落,這是最后一篇文章用來記錄下學(xué)習(xí)過程中的一些筆記和心得。 前面三篇文章分別是: 《SOAP 介紹》 《SOAP Web 服務(wù)介紹...

    wthee 評論0 收藏0
  • PHP超時(shí)處理全面總結(jié)

    摘要:的毫秒級超時(shí)也有問題。。中超時(shí)實(shí)現(xiàn)一初級最簡單的超時(shí)實(shí)現(xiàn)秒級超時(shí)思路很簡單鏈接一個后端,然后設(shè)置為非阻塞模式,如果沒有連接上就一直循環(huán),判斷當(dāng)前時(shí)間和超時(shí)時(shí)間之間的差異。實(shí)際處理這個調(diào)用的部件在完成后,通過狀態(tài)通知和回調(diào)來通知調(diào)用者。 概述 在PHP開發(fā)中工作里非常多使用到超時(shí)處理到超時(shí)的場合,我說幾個場景: 異步獲取數(shù)據(jù)如果某個后端數(shù)據(jù)源獲取不成功則跳過,不影響整個頁面展現(xiàn) 為了保...

    I_Am 評論0 收藏0
  • 應(yīng)對惡劣網(wǎng)絡(luò)環(huán)境,為php-curl設(shè)置超時(shí)限制,防止服務(wù)器卡死

    摘要:引發(fā)什么問題了呢最核心的問題是香港處在國際網(wǎng)絡(luò)環(huán)境,訪問大陸服務(wù)器時(shí)經(jīng)常會出現(xiàn)網(wǎng)絡(luò)抖動的現(xiàn)象,非常無解。其中,負(fù)責(zé)配置,則負(fù)責(zé)執(zhí)行即真正發(fā)送請求。 挖洋貨這項(xiàng)目,因?yàn)闆]有公司的名頭,也就無法備案,所以前端機(jī)放在阿里云香港ECS,另配一臺阿里云杭州ECS來跑crontab——執(zhí)行爬蟲、保存圖片到阿里云OSS等。最近覺得杭州ECS有點(diǎn)多余了(原本還有個杭州RDS的,統(tǒng)一搬到香港RDS了),...

    Faremax 評論0 收藏0
  • SOA面向服務(wù)基礎(chǔ)

    摘要:面向服務(wù)面向服務(wù)的基礎(chǔ)面向服務(wù)的三層應(yīng)用層,服務(wù)層,數(shù)據(jù)層應(yīng)用層用于給用戶展示,,,,安卓。在服務(wù)器端,進(jìn)程保持睡眠狀態(tài)直到調(diào)用信息到達(dá)為止。編譯完成,提示我們已經(jīng)在下了。 面向服務(wù) 面向服務(wù)的基礎(chǔ) 面向服務(wù)的三層:應(yīng)用層,服務(wù)層,數(shù)據(jù)層 * 應(yīng)用層:用于給用戶展示,PC,H5,IOS,安卓。 * 服務(wù)層:業(yè)務(wù)邏輯,提供接口(商品,訂單,支付,用戶,物流)。 * 數(shù)據(jù)層:提供數(shù)據(jù)支持(...

    songze 評論0 收藏0
  • 服務(wù)指南走北(二):微服務(wù)架構(gòu)的進(jìn)程間通信(IPC)

    摘要:微服務(wù)常用的進(jìn)程間通信技術(shù)即表述性狀態(tài)傳遞英文,簡稱是博士在年他的博士論文中提出來的一種軟件架構(gòu)風(fēng)格。摘自微服務(wù)實(shí)戰(zhàn)從架構(gòu)到部署處理部分請求失敗對于分布式的微服務(wù),必須要面對的一大問題就是局部請求失敗的處理。 先拋出幾個問題 微服務(wù)架構(gòu)的交互模式有哪些? 微服務(wù)常用的進(jìn)程間通信技術(shù)有哪些? 如何處理部分請求失敗? API的定義需要注意的事項(xiàng)有哪些 微服務(wù)的通信機(jī)制與SOA的通信機(jī)制之...

    beanlam 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<