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
소개
원격 서버가 RST 패킷을 보냈습니다. 이는 일반적인 핸드 셰이크가 아니라 연결이 즉시 끊어 졌음을 나타냅니다.
가능한 원인들
A. TCP / IP
콘텐츠 다운로드를 완료하기 전에 원격 서버가 연결되기 전에 대부분의 경우 호스트로 해결하거나 OS를 업그레이드해야하는 TCP / IP 문제 일 수 있습니다 Connection reset by peer
.
B. Kannel 버그
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/89160
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=50410
D. 최대 전송 단위
이 오류의 일반적인 원인 중 하나는 네트워크 연결을 통해 이동하는 패킷의 MTU (Maximum Transmission Unit) 크기가 기본값 인 1500 바이트에서 변경 되었기 때문입니다. 구성한 경우 구성 VPN
중에 변경해야합니다.
D. 방화벽 : iptables
이 녀석들에 대한 당신의 길을 모른다면 그들은 심각한 문제를 일으킬 것입니다 .. 연결하는 서버에 액세스하여 다음을 확인하십시오
- 해당 서버의 포트 80에 액세스 할 수 있습니다.
Example
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT`
- The Following is at the last line not before any other ACCEPT
Example
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
Check for ALL DROP , REJECT and make sure they are not blocking your connection
Temporary allow all connection as see if it foes through
Experiment
Try a different server or remote server ( So many fee cloud hosting online) and test the same script .. if it works then i guesses are as good as true ... You need to update your system
Others Code Related
A. SSL
If Yii::app()->params['pdfUrl']
is a url with https
not including proper SSL setting can also cause this error in old version of curl
Resolution : Make sure OpenSSL is installed and enabled then add this to your code
curl_setopt($c, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($c, CURLOPT_SSL_VERIFYHOST, false);
I hope it helps
Normally this error means that a connection was established with a server but that connection was closed by the remote server. This could be due to a slow server, a problem with the remote server, a network problem, or (maybe) some kind of security error with data being sent to the remote server but I find that unlikely.
Normally a network error will resolve itself given a bit of time, but it sounds like you’ve already given it a bit of time.
cURL sometimes having issue with SSL and SSL certificates. I think that your Apache and/or PHP was compiled with a recent version of the cURL and cURL SSL libraries plus I don't think that OpenSSL was installed in your web server.
Although I can not be certain However, I believe cURL has historically been flakey with SSL certificates, whereas, Open SSL does not.
Anyways, try installing Open SSL on the server and try again and that should help you get rid of this error.
So what is the URL that Yii::app()->params['pdfUrl']
gives? You say it should be https, but the log shows it's connecting on port 80... which almost no server is setup to accept https connections on. cURL is smart enough to know https should be on port 443... which would suggest that your URL has something wonky in it like: https://196.41.139.168:80/serve/?r=pdf/generatePdf
That's going to cause the connection to be terminated, when the Apache at the other end cannot do https communication with you on that port.
You realize your first $body
definition gets replaced when you set $body
to an array two lines later? {Probably just an artifact of you trying to solve the problem} You're also not encoding the client_url
and client_id
values (the former quite possibly containing characters that need escaping!) Oh and you're appending to $body_str
without first initializing it.
From your verbose output we can see cURL is adding a content-length
header, but... is it correct? I can see some comments out on the internets of that number being wrong (especially with older versions)... if that number was to small (for example) you'd get a connection-reset before all the data is sent. You can manually insert the header:
curl_setopt ($c, CURLOPT_HTTPHEADER,
array("Content-Length: ". strlen($body_str)));
Oh and there's a handy function http_build_query
that'll convert an array of name/value pairs into a URL encoded string for you.
All this rolls up into the final code:
$post=http_build_query(array(
"client_url"=>Yii::app()->params['pdfClientURL'],
"client_id"=>Yii::app()->params['pdfClientID'],
"title"=>$title,
"content"=>$content));
//Open to URL
$c=curl_init(Yii::app()->params['pdfUrl']);
//Send post
curl_setopt ($c, CURLOPT_POST, true);
//Optional: [try with/without]
curl_setopt ($c, CURLOPT_HTTPHEADER, array("Content-Length: ".strlen($post)));
curl_setopt ($c, CURLOPT_POSTFIELDS, $post);
curl_setopt ($c, CURLOPT_RETURNTRANSFER, true);
curl_setopt ($c, CURLOPT_CONNECTTIMEOUT , 0);
curl_setopt ($c, CURLOPT_TIMEOUT , 20);
//Collect result
$pdf = curl_exec ($c);
$curlInfo = curl_getinfo($c);
curl_close($c);
I faced same error but in a different way.
When you curl a page with a specific SSL protocol.
curl --sslv3 https://example.com
If --sslv3 is not supported by the target server then the error will be
curl: (35) TCP connection reset by peer
With the supported protocol, error will be gone.
curl --tlsv1.2 https://example.com
This is a firewall issue, if you are using a VMware application, make sure the firewall on the antivirus is turned off or allowing connections.
If this server is on a secure network, please have a look at firewall rules of the server.
Thanks Ganesh PNS
In my case there was problem in URL. I've use https://example.com - but they ensure 'www.' - so when i switched to https://www.example.com everything was ok. The proper header was sent 'Host: www.example.com'.
You can try make a request in firefox brwoser, persist it and copy as cURL - that how I've found it.
'Program Tip' 카테고리의 다른 글
mongodb 메모리 사용을 제한하는 옵션이 있습니까? (0) | 2020.12.11 |
---|---|
C ++ 11에서 명시 적으로 삭제 된 멤버 함수를 사용하여 복사 할 수없는 기본 클래스에서 상속 할 가치가 있습니까? (0) | 2020.12.11 |
WPF의 스택 패널에서 왼쪽과 오른쪽 모두에 컨트롤 정렬 (0) | 2020.12.11 |
VARCHAR 변수에 하위 문자열이 포함되어 있는지 어떻게 알 수 있습니까? (0) | 2020.12.11 |
다른 사용자가 설치 한 앱을 제거하는 방법은 무엇입니까? (0) | 2020.12.11 |