Ошибка CURL: ошибка Recv: сброс соединения с помощью peer-PHP Curl

у меня эта странная ошибка,ошибка CURL: ошибка Recv: сброс соединения одноранговым узлом

вот как это происходит, если я не подключался к серверу и вдруг пытаюсь подключиться к серверу через CURL в PHP, я получаю ошибку. Когда я снова запускаю сценарий 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

Я добавил в следующем toe удалить заголовок по умолчанию и по-прежнему не повезло:

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

6 ответов


введение

удаленный сервер отправил вам первый пакет, который указывает на немедленное падение соединения, а не обычное рукопожатие.

Возможные Причины

А. TCP / IP

это может быть проблема TCP / IP, которую вам нужно решить с вашим хостом или обновить ОС в большинстве случаев соединение закрывается перед удаленным сервером, прежде чем он закончит загрузку содержимого в Connection reset by peer.....

Б. Каннель Ошибка

обратите внимание, что есть некоторые проблемы с масштабированием окна TCP на некоторых ядрах Linux после v2.6.17. Дополнительные сведения см. В следующих отчетах об ошибках:

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

С. 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

Д. максимум Блок Передачи

одной из распространенных причин этой ошибки является то, что размер MTU (максимальная единица передачи) пакетов, перемещающихся по сетевому соединению, был изменен с значения по умолчанию 1500 байт. Если вы настроили VPN это, скорее всего, должно быть изменено во время конфигурации

Д. Брандмауэр: 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 
  • проверьте все падение, отклонить и убедитесь, что они не блокируют ваше соединение

  • временно разрешить все подключения, Как видите если он враг

эксперимент

попробуйте другой сервер или удаленный сервер (так много платного облачного хостинга онлайн) и протестируйте тот же сценарий .. если это сработает, то я думаю, что это так же хорошо, как правда ... You need to update your system

Другие Связанные С Кодом

А. протокол SSL

если Yii::app()->params['pdfUrl'] - это URL-адрес с https не включая правильную настройку SSL также может вызвать эту ошибку в старой версии curl

разрешение: убедитесь, что OpenSSL установлен и включен, а затем добавьте это в свой код

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

надеюсь, это поможет


обычно эта ошибка означает, что соединение было установлено с сервером, но это соединение было закрыто удаленным сервером. Это может быть связано с медленным сервером, проблемой с удаленным сервером, сетевой проблемой или (возможно) какой-то ошибкой безопасности с отправкой данных на удаленный сервер, но я нахожу это маловероятным.

обычно сетевая ошибка разрешится сама по себе, если дать ей немного времени, но похоже, что вы уже дали ей немного времени.

скручиваемость иногда возникают проблемы с SSL и сертификаты SSL. Я думаю, что ваш Apache и/или PHP был скомпилирован с последней версией библиотек Curl и curl SSL плюс я не думаю, что OpenSSL был установлен на вашем веб-сервере.

хотя я не могу быть уверен, однако, я считаю, что cURL исторически был flakey с сертификатами SSL, в то время как Open SSL этого не делает.

в любом случае, попробуйте установить Open SSL на сервере и повторите попытку, и это должно помочь вам избавиться от этого ошибка.


Итак, что такое URL-адрес, который Yii::app()->params['pdfUrl'] дает? Вы говорите, что это должен быть https, но журнал показывает, что он подключается к порту 80... который почти не настроен на сервер для приема https-соединений. cURL достаточно умен, чтобы знать, что https должен быть на порту 443... что предполагает, что Ваш URL-адрес имеет что-то шаткое в нем, как: https://196.41.139.168:80/serve/?r=pdf/generatePdf

это приведет к прекращению соединения, когда Apache на другом конце не сможет выполнить https-связь с вами на этом порт.

вы осознаете свой первый $body определение заменяется при установке $body в массив двумя строками позже? {Вероятно, это просто артефакт, который вы пытаетесь решить проблему} вы также не кодируете client_url и client_id значения (первые, вполне возможно, содержащие символы, которые нуждаются в экранировании!) О, и вы добавляете к $body_str без его инициализации.

из вашего подробного вывода мы видим, что cURL добавляет content-length заголовок, но... это правильно? Я вижу, что некоторые комментарии в интернете этого числа ошибочны (особенно с более старыми версиями)... если бы это число было небольшим (например), вы бы получили сброс соединения до отправки всех данных. Вы можете вручную вставить заголовок:

curl_setopt ($c, CURLOPT_HTTPHEADER, 
   array("Content-Length: ". strlen($body_str))); 

О, и есть удобная функция http_build_query это преобразует массив пар имя / значение в строку, закодированную URL для вас.

все это закатывается в финал код:

$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);

это проблема брандмауэра, если вы используете приложение VMware, убедитесь, что брандмауэр антивируса выключен или разрешены подключения.

Если этот сервер находится в защищенной сети, ознакомьтесь с правилами брандмауэра сервера.

спасибо Ганеш ПНС


в моем случае была проблема в URL. Я использую https://example.com - но они обеспечивают " www.- так, когда я переключился на https://www.example.com все было ок. Правильный заголовок был отправлен 'Host: www.example.com'.

вы можете попробовать сделать запрос в firefox brwoser, сохранить его и скопировать как cURL-вот как я его нашел.


я столкнулся с той же ошибки, но по-другому.

когда вы сворачиваете страницу с определенным протоколом SSL.

curl --sslv3 https://example.com

Если --sslv3 не поддерживается целевым сервером, то ошибка будет

curl: (35) сброс TCP-соединения одноранговым узлом

с поддерживаемым протоколом ошибка исчезнет.

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