web-dev-qa-db-ja.com

CURLエラー:受信エラー:ピアによる接続のリセット-PHP Curl

この奇妙なエラーが発生していますCURL ERROR:Recv failure:Connection reset by peer

これは、サーバーに接続せず、PHPのCURLを介してサーバーに接続しようとするとエラーが発生するためです。 CURLスクリプトを再度実行すると、エラーが消えてからずっと正常に動作します。リモートサーバーを約30分間アイドル状態のままにするか、リモートサーバーを再起動して再度接続しようとすると、エラーが再度表示されます。そのため、接続はアイドル状態になり、その後突然サーバーが起動して動作し、再びスリープするようです。

これが私のCURLスクリプトの見た目です。

$url = Yii::app()->params['pdfUrl'];
            $body = 'title='.urlencode($title).'&client_url='.Yii::app()->params['pdfClientURL'].'&client_id='.Yii::app()->params['pdfClientID'].'&content='.urlencode(htmlentities($content));

            $c = curl_init ($url);
            $body = array(
                "client_url"=>Yii::app()->params['pdfClientURL'],
                "client_id"=>Yii::app()->params['pdfClientID'],
                "title"=>urlencode($title),
                "content"=>urlencode($content)

            );
            foreach($body as $key=>$value) { $body_str .= $key.'='.$value.'&'; }
                rtrim($body_str,'&');

            curl_setopt ($c, CURLOPT_POST, true);
            curl_setopt ($c, CURLOPT_POSTFIELDS, $body_str);
            curl_setopt ($c, CURLOPT_RETURNTRANSFER, true);
            curl_setopt ($c, CURLOPT_CONNECTTIMEOUT , 0);
            curl_setopt ($c, CURLOPT_TIMEOUT  , 20);

            $pdf = curl_exec ($c);
            $errorCode = curl_getinfo($c, CURLINFO_HTTP_CODE);
            $curlInfo = curl_getinfo($c);
            $curlError = curl_error($c);

            curl_close ($c);

私は完全にアイデアと解決策がありません、助けてください、私はそれを感謝します!!!

を使用して何が起こるかを確認するために出力を詳細化する場合

curl_setopt ($c, CURLOPT_VERBOSE, TRUE);
curl_setopt($c, CURLOPT_STDERR, $fp); 

私は次のようになります

* About to connect() to 196.41.139.168 port 80 (#0)
*   Trying 196.x.x.x... * connected
* Connected to 196.x.x.x (196.x.x.x) port 80 (#0)
> POST /serve/?r=pdf/generatePdf HTTP/1.1
Host: 196.x.x.x
Accept: */*
Content-Length: 7115
Content-Type: application/x-www-form-urlencoded
Expect: 100-continue

* Recv failure: Connection reset by peer
* Closing connection #0
012 20:23:49 GMT
< Server: Apache/2.2.15 (CentOS)
< X-Powered-By: PHP/5.3.3
< Connection: close
< Transfer-Encoding: chunked
< Content-Type: text/html; charset=UTF-8
< 
* Closing connection #0

私は次のつま先にデフォルトのヘッダーを削除しましたが、まだ運がありません:

curl_setopt ($c, CURLOPT_HTTPHEADER, array( 'Expect:' ) );

> Accept: */* Content-Length: 8414 Content-Type:
> application/x-www-form-urlencoded
> 
> * Recv failure: Connection reset by peer
> * Closing connection #0 r: Apache/2.2.15 (CentOS) < X-Powered-By: PHP/5.3.3 < Connection: close < Transfer-Encoding: chunked <
> Content-Type: text/html; charset=UTF-8 < 
> * Closing connection #0
58
Roland

前書き

リモートサーバーからRSTパケットが送信されました。これは、通常のハンドシェイクではなく、接続の即時ドロップを示しています。

考えられる原因

A.TCP/IP

ホストで解決するか、OSをアップグレードする必要があるTCP/IPの問題である可能性があります。ほとんどの場合、リモートサーバーがConnection reset by peer.....につながるコンテンツのダウンロードを完了する前に接続が閉じます。

B.チャンネルバグ

V2.6.17以降の一部のLinuxカーネルでは、TCPウィンドウのスケーリングに問題があることに注意してください。詳細については、次のバグレポートを参照してください。

https://bugs.launchpad.net/ubuntu/+source/linux-source-2.6.17/+bug/59331

https://bugs.launchpad.net/ubuntu/+source/linux-source-2.6.20/+bug/8916

C.PHPとCURLのバグ

PHP/5.3.3を使用していますが、これには重大なバグもあります... PHPおよびCURLの最新バージョンを使用することをお勧めします

https://bugs.php.net/bug.php?id=52828

https://bugs.php.net/bug.php?id=52827

https://bugs.php.net/bug.php?id=52202

https://bugs.php.net/bug.php?id=5041

D.最大伝送ユニット

このエラーの一般的な原因の1つは、ネットワーク接続を通過するパケットのMTU(Maximum Transmission Unit)サイズがデフォルトの1500バイトから変更されたことです。 VPNを設定した場合、これはおそらく設定中に変更する必要があります

D.ファイアウォール:iptables

あなたがこの人たちの周りのあなたの方法を知らない場合、彼らはいくつかの深刻な問題を引き起こすでしょう..あなたが接続しているサーバーにアクセスして、以下を確認してください

  • そのサーバーのポート80にアクセスできます

 -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT`
  • 以下は、他のACCEPTの前ではなく最後の行にあります

  -A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-Host-prohibited 
  • すべてのドロップ、拒否を確認し、接続がブロックされていないことを確認します

  • 一時的にすべての接続を許可します。

実験

別のサーバーまたはリモートサーバー(オンラインでホスティングされている非常に多くの料金クラウド)を試して、同じスクリプトをテストします..それが機能する場合は、trueと同じくらい良いと思います... You need to update your system

その他のコード関連

A.SSL

Yii::app()->params['pdfUrl']httpsのURLで、適切なSSL設定が含まれていない場合、古いバージョンのcurlでもこのエラーが発生する可能性があります。

解決策:OpenSSLがインストールされ有効になっていることを確認してから、これをコードに追加します

curl_setopt($c, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($c, CURLOPT_SSL_VERIFYHOST, false);

私はそれが役立つことを願っています

97
Baba

通常、このエラーは、サーバーとの接続が確立されたが、その接続がリモートサーバーによって閉じられたことを意味します。これは、サーバーの速度が遅い、リモートサーバーの問題、ネットワークの問題、または(おそらく)リモートサーバーに送信されるデータに関する何らかのセキュリティエラーが原因である可能性がありますが、そうは思えません。

通常、ネットワークエラーは少し時間が経過すると自動的に解決しますが、すでに少し時間がかかっているようです。

cURLでSSLおよびSSL証明書に問題がある場合があります。あなたのApacheやPHPは、cURLとcURL SSLライブラリの最新バージョンでコンパイルされたと思いますが、OpenSSLがWebサーバーにインストールされていないと思います。

確かではありませんが、cURLは歴史的にSSL証明書にゆるみがあると信じていますが、Open SSLはそうではありません。

とにかく、サーバーにOpen SSLをインストールして再試行してください。これにより、このエラーを取り除くことができます。

11
Aamer

私は同じエラーに直面しましたが、異なる方法で。

特定のSSLプロトコルでページをカールするとき。

curl --sslv3 https://example.com

--sslv3がターゲットサーバーでサポートされていない場合、エラーは

curl:(35)TCP接続がピアによってリセットされました

サポートされているプロトコルを使用すると、エラーはなくなります。

curl --tlsv1.2 https://example.com
2
xs2rashid

これはファイアウォールの問題です。VMwareアプリケーションを使用している場合、ウイルス対策のファイアウォールがオフになっているか、接続を許可していることを確認してください。

このサーバーがセキュリティで保護されたネットワーク上にある場合は、サーバーのファイアウォール規則をご覧ください。

ありがとう、ガネーシュPNS

1
GANESH

私の場合、URLに問題がありました。 https://example.com を使用しましたが、「www。」を保証します-だから https://www.example.com に切り替えたとき、すべてが大丈夫だった。適切なヘッダーが「Host:www.example.com」に送信されました。

Firefox brwoserでリクエストを作成し、それを永続化してcURLとしてコピーすることができます-私が見つけた方法です。

0
Radek