web-dev-qa-db-ja.com

SoapClientでのHTTPヘッダーの取得エラー

リモートのHost:remoteポートでhttps経由でWSを起動しようとしていますが、次のようになります:

HTTPヘッダーの取得エラー

pHP5 SoapClientを使用します。 $client->__getFunctions()を実行することで関数のリストを取得できますが、$client->myFunction(...)を呼び出すと、常にこのエラーが発生します。

グーグルで調べたところ、_default_socket_timeout php.iniで修正する必要がありますが、機能しませんでした。

誰も私に解決策を提案できますか?

編集:ここにコードがあります:

$wsdl="myWSDL";

$client = new SoapClient($wsdl,array('connection_timeout'=>5,'trace'=>true,'soap_version'=>SOAP_1_2));

var_dump($client->__getFunctions());

try {
    $response=$client->myFunction("1","2","3");
         } catch (SoapFault $fault) {
    var_dump($fault);
    }
}

常にエラーで終了します。

問題を解決するにはどうすればよいですか?

39
Cris

このエラーは、default_socket_timeout値がSOAP応答に対して超過しています。( このリンクを参照 。)

SoapClientコンストラクターからの注意:connection_timeoutオプションは、応答のタイムアウトではなく、サービスに接続するためのタイムアウト値を定義するために使用されます。

次のように増やすことができます。

ini_set('default_socket_timeout', 600); // or whatever new value you want

これにより、タイムアウトが問題であるかどうか、または別の問題があるかどうかがわかります。 これを永続的な解決策として使用するべきではないことに注意してください。 SOAPサービスの応答が非常に遅い。サービスが常にこのように遅い場合は、オフライン/バッチ処理を検討する必要があります。

56
cmbuckley

私の特定の状況でこの問題の解決策を共有したかっただけです(同じ症状がありました)。私のシナリオでは、Webサービスによって提供されたSSL証明書が信頼されなくなったことが判明しました。実際には、クライアントがインストールした新しいファイアウォールがSOAP要求を妨害していましたが、最終的な結果は証明書が正しく提供/信頼されていなかったためです。

SoapClient呼び出しは(trace = 1であっても)非常に有用なフィードバックを提供しないため、追跡するのが少し困難でした。

以下を使用して、信頼できない証明書を証明できました。

openssl s_client -connect <web service Host>:<port>

これがすべての人の問題に対する答えではないことはわかっていますが、うまくいけば誰かの助けになります。いずれにせよ、このエラーの原因(障害コード:「HTTP」フォールトストリング:「エラーフェッチHTTPヘッダー」)は、単に「十分に許可していない」というよりも、通常ネットワーク/ソケット/プロトコル/通信の問題であると認識することが重要だと思いますリクエストの時間」。 default_socket_timeoutの値を拡張することでこの問題が頻繁に解決されるとは想像できませんが、たとえ解決したとしても、そもそも非常に遅い理由の問題を解決する方が確実です。

10
Manachi

遅すぎると思いますが、同じ問題があります。ソケットのタイムアウトを試してみましたが、機能しません。私の問題は、クライアントとサーバーが同じ物理サーバーにあることです。同じ物理サーバーで動作するクライアントコードでは、このエラーが発生しますが、同じクライアントコードをローカルホストに移動してサーバーを要求すると(クライアントとサーバーは2つの異なるマシンで実行されます)、すべて正常に動作します。

たぶんそれは他の誰かを助けることができます!

8
Jonathan Huet

設定'keep_alive' falseに私のために働いた:

new SoapClient($api_url, array('keep_alive' => false));
5
Thiago Sathler

私は同じ問題に直面し、上記のすべての解決策を試しました。残念ながら何も機能しませんでした。

  1. ソケットタイムアウト(機能しませんでした)
  2. ユーザーエージェント(機能しませんでした)
  3. SoapClient構成、cache_wsdlおよびKeep-Aliveなど...

compression headerプロパティを追加することで問題を解決しました。これは、gzip圧縮形式での応答を期待している場合に実際に必要です。

//set the Headers of Soap Client. 
$client = new SoapClient($wsdlUrl, array(
    'trace' => true, 
    'keep_alive' => true,
    'connection_timeout' => 5000,
    'cache_wsdl' => WSDL_CACHE_NONE,
    'compression'   => SOAP_COMPRESSION_ACCEPT | SOAP_COMPRESSION_GZIP | SOAP_COMPRESSION_DEFLATE,
));

それが役に立てば幸い。

幸運を。

3
Sanjay Mohnani

私のために働いた構成は、私のPHPスクリプトで次のパラメータを定義していました:

ini_set('default_socket_timeout', 5000);
$client = new \SoapClient($url,array(
    'trace' =>true,
    'connection_timeout' => 5000,
    'cache_wsdl' => WSDL_CACHE_NONE,
    'keep_alive' => false,
));

コメントしてください。

この問題に関する私の経験によると、最も重要なパラメーターの定義は

ini_set('default_socket_timeout', 5000);

テスト中にdefault_socket_timeoutを5秒に定義し、エラー「エラーフェッチHTTPヘッダー」が即座に発生しました。

お役に立てばと思います!

完全を期すために、使用しているクライアント証明書にはパスフレーズが必要であり、パスフレーズの最後に誤って余分な文字があったため、このメッセージを受け取ったマナチと同様に追加したかっただけです。この投稿は、調査対象に関する別の提案を提供するためのものです。ホストが(local_certパラメーターを介して)クライアント証明書の使用を必要とする場合は、証明書への正しいパスと正しいパスフレーズ(必要な場合)を指定してください。そうしないと、同じエラーメッセージが表示される可能性が高くなります。

1
borq

上記の手法はどれも役に立たなかった。

__getLastRequestHeadersからのリクエストヘッダーを分析すると、次のことがわかりました。

POST /index.php/api/index/index/?SID=012345 HTTP/1.1 Host: www.XYZ.com

私が使用していたAPI URLは、www.ABC.comのように異なっていました。 API URLをwww.XYZ.com/index.php/api?wsdlに変更し、それが機能しました。

両方のURLが同じサーバーから同じWSDLを返しましたが、ログインを許可したのは1つだけです。

1
humbads

この同じエラーが発生し、私の場合、リクエストを送信していたサーバーは504 Gateway Time-outエラーで応答していました。 SOAP request:

例えば。 https://soap-request-domain-here.com/path/to/file.wsdl

0
John Langford

私は同じ問題を抱えており、keep_aliveを無効にして次のことを試みました。

$api_proxy = new SoapClient($api_url, array('trace' => true, 'keep_alive' => false));

しかし、それは私にとってはうまくいきませんでした。私のために働いたのは、SOAPキャッシュを無効にすることでした。間違ったリクエストをキャッシュしていたようです。

Linuxサーバーでは、/etc/php.iniファイルでこれを見つけることができます。

soap.wsdl_cache_enabled=1を探し、soap.wsdl_cache_enabled=0に変更します。

Apacheをリロードすることを忘れないでください。 service httpd reload

0
MagentoMan

このエラーの別の考えられる原因は、OpenSSLの一部の操作でクリアされていないエラーが残っていることです。 SOAPをクリアするリクエストの前にこのコードを置きます:

while (openssl_error_string()) {}
0
Furgas

応答HTTPヘッダーを確認してください。私の場合、次のヘッダーがAPIサイトに設定されました。

<IfModule mod_headers.c>
    Header set Connection keep-alive
</IfModule>

PHP SoapClientはそのオプションを処理できないようです。結果として、応答本文は空でしたが、応答ヘッダーのcontent-lengthは正しく設定されています。

その行を削除するか、「閉じる」に変更して問題を解決しました。

0
Matthias Kleine

SoapClient::__soapCall(,)の2回の呼び出しごとにError fetching http headersに遭遇しました。ただし、すべての石鹸エンドポイント/石鹸サーバーが影響を受けたわけではありません。

httpへの切り替えはすべてのサーバーで確実に機能していましたが、https/secure HTTPを介した接続は上記の症状を示していました。 openssl_error_string() as Furgas推奨 はエラーを返しませんでした。

不正な動作をしているsoapサーバーが、応答ごとにHTTPヘッダーを送信し、soapクライアントが2番目のsoap呼び出しで窒息することになりました:Connection: Upgrade, close。正常に動作するサーバーは、連続した応答で pgrade を送信しませんでした。

私たちのために働いたもの:

  • keep_aliveをfalseに設定します Thiagoによる言及
  • .htaccessファイルを介したアップグレードおよび接続ヘッダーの設定解除

正常に動作する石鹸サーバーにはこれは必要ありませんでしたが、誤動作にはかつてkeep_aliveをfalseに設定し、ヘッダーを設定解除する必要がありました。

# .htaccess
Header unset Upgrade
Header unset Connection

根本原因はまだ不明ですが、HTTPSを使用する場合のヘッダーのアップグレードに関する Apacheのバグレポート があります。

0
Richard Kiefer

私はこの問題を抱えていて、チェックしました。私の場合はファイアウォールでした。 PHPエラーが正しく表示されません。リクエストを実行するために、ファイアウォールは応答しました:

HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
...
<html
...
<h1>Direct Access IP is not allowed</h1>
...
</html>

SoapClientは、SOAP=エンベロープを期待しますが、HTMLコードを受け取ります。そのため、PHPが応答します。HTTPヘッダーの取得エラー」問題を解決するには、ネットワーク管理者に連絡して、ファイアウォール、NAT、または邪魔になるプロキシ)があるかどうかを確認し、必要な調整を依頼してください。

0
Mauro