1

複数のサイト/サーバーで同じコードを実行しています。2 日前、サーバーの 1 つで、コードが http_code = 0 と「サーバーからの返信がありません」というエラー メッセージを返し始めました。

特定のサーバーがある日は機能し、次の日は機能しない理由について、誰かが光を当てることができますか? 問題を説明するチケットを ISP に送信しましたが、問題の原因を (まだ) 見つけられないようです。

問題は、これが機能しないようにするためにサーバーで何が変更されるか、または変更される可能性があるかということです。

興味深いのは、私が参照している URL が、エラーを返すサーバーに影響を与えないことです。存在しないものを指すように URL を変更すると、同じエラーが返されます。そのため、合計で CURL POST 参照がサーバーによって拒否されているようです。私は現在、これらの問題のあるサイトにヒットしている他の CURL スクリプトを持っていますが、それらはまだ機能していますが、それらには POST オプションがありません。

この問題は間違いなくこのサーバー上の CURL POST リクエストに関連しており、すぐに拒否されています。

問題のサーバーには15以上の個別のアカウントがあり、それらのすべてが同じ結果を返すため、この問題が発生した時点ですべてのサイトに大規模な変更を加えていないことがわかっているため、何も変更していないと思います. 私が他の場所でホストした他の 6 つのサイトのうち、すべてがまったく同じコードで正常に動作しています。

私が読んだ投稿からオプションへのさまざまな組み合わせ/変更を試みましたが、実際には何も違いはありませんでした。動作しているサイトは引き続き動作し、動作していないサイトはまだ動作しません.

function sendWSRequest($url, $xml) {

//  $headers[] = 'Content-Type: application/xml; charset=utf-8';
    $headers[] = 'Content-Type: text/xml; charset=utf-8';
    $headers[] = 'Content-Length: ' . strlen($xml);

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_HEADER, true);
//  curl_setopt($ch, CURLINFO_HEADER_OUT, false);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
//  curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20);

    $result = curl_exec($ch);
    if($result===false) {
        print 'error with curl - '.curl_error($ch).'<br />';
    }

    $info = curl_getinfo($ch);

    curl_close($ch);

    return $result;
}

どんな助けでも大歓迎です。

EDITさらなる調査に基づいて要約すると、スクリプトがエラーになると、サーバーアクセスログには何も記録されません。そのため、アクセスが許可/ログに記録される前に、POST オプションを含む CURL リクエストが拒否されているようです...

乾杯

グレッグ J

4

3 に答える 3

5

これが古いスレッドであることは知っていますが、他の人の頭痛の種を救う可能性のある解決策を見つけました。

最近まで機能していた GoDaddy でホストされている Web サイトで、まさにこの問題に遭遇し始めました。この問題を調査するために、cURL を介して POST データで送信されるのと同じフィールドを含むフォームを含む HTML ページを作成しました。

ブラウザから送信された HTML フォームは機能しましたが、cURL POST でEmpty reply from serverエラーが発生しました。apache_request_headers()そこで、cURL とブラウザーの両方の送信が機能する私の開発システムで PHP 関数を使用して、ブラウザーによって送信されたヘッダーと cURL によって送信されたヘッダーの違いを調べました。

ブラウザから送信された「User-Agent」ヘッダーを cURL POST に追加するとすぐに、問題のサイトは空の応答を返すのではなく、期待どおりに機能しました。

CURLOPT_HTTPHEADER =>
      array("User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:31.0) Gecko/20100101 Firefox/31.0")

このクイックフィックスで問題が解決したため、他の/より単純な User-Agent ヘッダーは試しませんでした。

于 2014-07-28T07:10:29.900 に答える
2

PHP マニュアルによると、アップロードはurlencodeする必要があります。

CURLOPT_POSTFIELDS HTTP "POST" 操作で投稿する完全なデータ。[...] このパラメーターは、 'para1=val1¶2=val2&...' のようなurlencoded 文字列として渡すか、フィールド名をキーとし、フィールド データを値とする配列として渡すことができます。値が配列の場合、Content-Type ヘッダーは multipart/form-data に設定されます。PHP 5.2.0 以降、ファイルが @ 接頭辞付きでこのオプションに渡される場合、値は配列でなければなりません。PHP 5.5.0 以降、@ プレフィックスは廃止され、CURLFile を使用してファイルを送信できます。

だからあなたは試してみてください

curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, 'xml=' . urlencode($xml));

そして何が起こるか見てください。または、とにかく、空または非常に単純な FIELD から開始して、少なくとも宛先サーバーに到着するかどうかを確認します。

アップデート

テスト マシンでこのセットアップを確認したところ、動作します。現時点では、問題は PHP または cURL 側にあるとは考えられません。過去数日間にそのマシンとネットワークで行われたソフトウェア/ハードウェアの更新のリストをリクエストできますか?

それ以外の場合は、送信トラフィックをキャプチャして、リクエストがサーバーを離れているかどうかを判断しようとします (そして、問題はその間にあります。たとえば、ファイアウォールの構成が間違っているため、変更リストに「ハードウェア」が含まれています)。サーバーから完全に離れます。この後者の場合、犯人は次のようになります。

  • cURL ライブラリの更新
  • PHP cURL モジュールおよび/または PHP バイナリの更新
  • 「ソフトウェア」ファイアウォール ルールの更新
  • 補助的なネットワーク ライブラリの更新 (可能性は低いです。HTTP に依存せず、POST と GET や HEAD を区別しないようにする必要があります)
于 2013-09-12T21:56:37.993 に答える
0

OK、結局のところ、かなり気が進まないホストが Apache2 と PHP を再コンパイルしたことで、問題は解決しました。

ホストは (私のサポート チケットへの最初の声明)、問題が発生した頃に Apache2 も PHP も更新されていないと主張しています。

この動作は、POST コマンドを含む CURL 要求を確認することさえしていないというものでした。ターゲット URL に到達しませんでした。

アドバイスをくださった皆様、本当にありがとうございました。特に、解決策を見つけるために多大な努力を払ったイセミ。

于 2013-09-30T01:09:18.630 に答える