ホームページ  >  記事  >  バックエンド開発  >  PHP での CURL および SOAP リクエストのサービスタイムアウトの問題を解決する方法

PHP での CURL および SOAP リクエストのサービスタイムアウトの問題を解決する方法

不言
不言オリジナル
2018-06-11 14:00:272343ブラウズ

この記事では主に、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 配列をデータベースに保存する方法

3 つの PHP 再帰関数を実装する方法数字の蓄積

#

以上がPHP での CURL および SOAP リクエストのサービスタイムアウトの問題を解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。