この記事では主に、PHP におけるカールとソープのリクエスト サービスのタイムアウトの問題の解決策を紹介します。内容が非常に優れているので、参考として共有します。
社内の多くのサービスは、サードパーティ企業が提供するサービスに接続してデータを交換するためにカールまたはソープを使用していますが、最近、サードパーティ サービスのリリース時に、次のような新しい要件が追加されました。相手のサーバに接続できないため、リトライする場合、その他の理由で業務処理が失敗した場合は失敗として扱われ、再度呼び出されることはありません。
curlやsoapが相手のサーバーに接続できないと判断してTimeoutException例外をスローし、他のエラーでスローされた例外は失敗として扱うという考え方です。 。
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", "URL を解析できません", NULL, NULL );
add_soap_fault(this_ptr, "HTTP", "不明なプロトコル。http と https のみが許可されます。", NULL, NULL);
add_soap_fault(this_ptr, "HTTP", "このプロトコルでは SSL サポートは利用できませんbuild", NULL, NULL);
add_soap_fault(this_ptr, "HTTP", "ホストに接続できませんでした", NULL, NULL);
add_soap_fault(this_ptr, "HTTP", "HTTP SOAP リクエストの送信に失敗しました" , NULL, NULL);
add_soap_fault(this_ptr, "HTTP", "ストリームの作成に失敗しました??", NULL, NULL);
add_soap_fault(this_ptr, "HTTP", "http ヘッダーの取得エラー", NULL , NULL) ;
add_soap_fault(this_ptr, "HTTP", "http 本文の取得エラー、Content-Length がありません、接続が閉じられているか、またはチャンクされたデータです", NULL, NULL);
add_soap_fault(this_ptr, "HTTP", "リダイレクト制限に達しました、中止します", NULL, NULL);
add_soap_fault(this_ptr, "HTTP", "XML ドキュメントを受信できませんでした", NULL, err);
add_soap_fault(this_ptr, "HTTP", "不明なコンテンツ - エンコーディング", NULL, NULL);
add_soap_fault(this_ptr, "HTTP", "圧縮された応答を解凍できません", NULL, NULL);
add_soap_fault(this_ptr, "HTTP", http_msg, NULL , NULL) ;
コードから、接続が失敗した場合に HTTP コードが返されることがわかります。soap には、curl のように 2 つを区別するための特定のコードがありません。このコードは、タイムアウトや接続の失敗などのネットワークの問題であることを判断するためにのみ使用できます。
具体的なコードは次のとおりです。
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 中国語 Web サイトに注目してください。
関連する推奨事項:
#
以上がPHP での CURL および SOAP リクエストのサービスタイムアウトの問題を解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。