摘要:公司中有不少服務是以或者方式連接第三方公司做的服務來交互數據,最近新增加了個需求,就是第三方服務發版時候,連接不上對方服務器時候要進行重試,其它原因導致的業務處理失敗,則按失敗處理,不會再進行調用。
公司中有不少服務是以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捕獲請求超時和連接超時的方法。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/28797.html
摘要:對的相關學習就先告此一段落,這是最后一篇文章用來記錄下學習過程中的一些筆記和心得。對,沒錯在還沒有提供擴展前,的確很多人也是這樣做的。總結上面都是自己在學習擴展時的一些零散的筆記,如果有不對的地方,希望大家指出,謝謝。 對 SOAP 的相關學習就先告此一段落,這是最后一篇文章用來記錄下學習過程中的一些筆記和心得。 前面三篇文章分別是: 《SOAP 介紹》 《SOAP Web 服務介紹...
摘要:的毫秒級超時也有問題。。中超時實現一初級最簡單的超時實現秒級超時思路很簡單鏈接一個后端,然后設置為非阻塞模式,如果沒有連接上就一直循環,判斷當前時間和超時時間之間的差異。實際處理這個調用的部件在完成后,通過狀態通知和回調來通知調用者。 概述 在PHP開發中工作里非常多使用到超時處理到超時的場合,我說幾個場景: 異步獲取數據如果某個后端數據源獲取不成功則跳過,不影響整個頁面展現 為了保...
摘要:引發什么問題了呢最核心的問題是香港處在國際網絡環境,訪問大陸服務器時經常會出現網絡抖動的現象,非常無解。其中,負責配置,則負責執行即真正發送請求。 挖洋貨這項目,因為沒有公司的名頭,也就無法備案,所以前端機放在阿里云香港ECS,另配一臺阿里云杭州ECS來跑crontab——執行爬蟲、保存圖片到阿里云OSS等。最近覺得杭州ECS有點多余了(原本還有個杭州RDS的,統一搬到香港RDS了),...
摘要:微服務常用的進程間通信技術即表述性狀態傳遞英文,簡稱是博士在年他的博士論文中提出來的一種軟件架構風格。摘自微服務實戰從架構到部署處理部分請求失敗對于分布式的微服務,必須要面對的一大問題就是局部請求失敗的處理。 先拋出幾個問題 微服務架構的交互模式有哪些? 微服務常用的進程間通信技術有哪些? 如何處理部分請求失敗? API的定義需要注意的事項有哪些 微服務的通信機制與SOA的通信機制之...
閱讀 767·2021-10-09 09:58
閱讀 635·2021-08-27 16:24
閱讀 1719·2019-08-30 14:15
閱讀 2377·2019-08-30 11:04
閱讀 2061·2019-08-29 18:43
閱讀 2166·2019-08-29 15:20
閱讀 2712·2019-08-26 12:20
閱讀 1612·2019-08-26 11:44