この奇妙なエラーが発生しています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
リモートサーバーから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
あなたがこの人たちの周りのあなたの方法を知らない場合、彼らはいくつかの深刻な問題を引き起こすでしょう..あなたが接続しているサーバーにアクセスして、以下を確認してください
例
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j 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);
私はそれが役立つことを願っています
通常、このエラーは、サーバーとの接続が確立されたが、その接続がリモートサーバーによって閉じられたことを意味します。これは、サーバーの速度が遅い、リモートサーバーの問題、ネットワークの問題、または(おそらく)リモートサーバーに送信されるデータに関する何らかのセキュリティエラーが原因である可能性がありますが、そうは思えません。
通常、ネットワークエラーは少し時間が経過すると自動的に解決しますが、すでに少し時間がかかっているようです。
cURLでSSLおよびSSL証明書に問題がある場合があります。あなたのApacheやPHPは、cURLとcURL SSLライブラリの最新バージョンでコンパイルされたと思いますが、OpenSSLがWebサーバーにインストールされていないと思います。
確かではありませんが、cURLは歴史的にSSL証明書にゆるみがあると信じていますが、Open SSLはそうではありません。
とにかく、サーバーにOpen SSLをインストールして再試行してください。これにより、このエラーを取り除くことができます。
私は同じエラーに直面しましたが、異なる方法で。
特定のSSLプロトコルでページをカールするとき。
curl --sslv3 https://example.com
--sslv3がターゲットサーバーでサポートされていない場合、エラーは
curl:(35)TCP接続がピアによってリセットされました
サポートされているプロトコルを使用すると、エラーはなくなります。
curl --tlsv1.2 https://example.com
これはファイアウォールの問題です。VMwareアプリケーションを使用している場合、ウイルス対策のファイアウォールがオフになっているか、接続を許可していることを確認してください。
このサーバーがセキュリティで保護されたネットワーク上にある場合は、サーバーのファイアウォール規則をご覧ください。
ありがとう、ガネーシュPNS
私の場合、URLに問題がありました。 https://example.com を使用しましたが、「www。」を保証します-だから https://www.example.com に切り替えたとき、すべてが大丈夫だった。適切なヘッダーが「Host:www.example.com」に送信されました。
Firefox brwoserでリクエストを作成し、それを永続化してcURLとしてコピーすることができます-私が見つけた方法です。