Почему я получаю HTTP_CODE 0 от curl?
Я использовал curl с PHP некоторое время. Сегодня я пытался получить http://www.webhostingstuff.com/category/Best-Hosting.html, и я продолжаю получать http-код 0, который для меня новичок.
Я устанавливаю заголовки
$s->headers = array(
"User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1",
"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Language: en-gb,en;q=0.5",
"Accept-Encoding: gzip, deflate",
"Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7",
"Keep-Alive: 115",
"Connection: keep-alive",
"Referer: https://google.com"
);
и у меня есть файл cookie (который не имеет ничего, когда script заканчивает загрузку)
Здесь функция завитка
function fetch($url, $username='', $data='', $proxy=''){
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, true);
if(isset($proxy)) {
curl_setopt($ch,CURLOPT_TIMEOUT,30);
curl_setopt($ch, CURLOPT_PROXY, $proxy);
curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1);
curl_setopt($ch, CURLOPT_PROXYPORT, $proxy);
curl_setopt($ch, CURLOPT_PROXYUSERPWD, 'proxyadmin:parola');
}
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FRESH_CONNECT,true);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1");
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_MAXREDIRS, 5);
if(!empty($username)) {
curl_setopt($ch, CURLOPT_COOKIEFILE, "cookie/{$username}.txt");
curl_setopt($ch, CURLOPT_COOKIEJAR, "cookie/{$username}.txt");
}
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
if (is_array($data) && count($data)>0) {
curl_setopt($ch, CURLOPT_POST, true);
$params = http_build_query($data);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
}
if (is_array($this->headers) && count($this->headers)>0){
curl_setopt($ch, CURLOPT_HTTPHEADER, $this->headers);
}
$this->result = curl_exec($ch);
$curl_info = curl_getinfo($ch);
$header_size = $curl_info["header_size"];
$this->headers = substr($this->result, 0, $header_size);
$this->http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$this->error = curl_error($ch);
curl_close($ch);
}
Я также пытался выполнить через SSH с другого сервера (в случае его блокировки IP)
[[email protected] ~]$ curl -url http://www.webhostingstuff.com/addcomments/5ite.html
Enter host password for user 'rl':
curl: (7) couldn't connect to host
[[email protected] ~]$
Как я могу это решить?
Ответы
Ответ 1
Код состояния 0 означает, что соединение было закрыто (изящно) до того, как был возвращен любой результат.
Наверное, я начну с выяснения, можно ли вообще подключиться к машине. Если у вас есть доступ к удаленному компьютеру, это, скорее всего, поможет отлаживать.
Ответ 2
Ваша команда
curl -url http://www.webhostingstuff.com/addcomments/5ite.html
должен был быть:
curl --url http://www.webhostingstuff.com/addcomments/5ite.html
cURL считает, что вы указываете опцию -u, которая используется для указания имени пользователя, и, следовательно, сообщение об ошибке, которое вы получили. Вам нужно указать -url (две тире).
Надеюсь, что это по крайней мере помогает при отладке.
Ответ 3
В моем случае код http 0 возвращался из-за таймаута соединения. Добавив
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20);
Мне удалось избавиться от ошибки
Ответ 4
Возможно, это была некоторая внутренняя ошибка сервера? Сейчас он работает:
> GET /category/Best-Hosting.html HTTP/1.1
> User-Agent: HTTP_Request2/0.5.2 (http://pear.php.net/package/http_request2) PHP/5.2.12
> Host: www.webhostingstuff.com
> Accept: */*
> Accept-Encoding: deflate, gzip
>
< HTTP/1.1 200 OK
< date: Sun, 31 Jul 2011 10:57:43 GMT
< server: Apache
< last-modified: Sun, 31 Jul 2011 10:55:00 GMT
< content-encoding: gzip
< vary: Accept-Encoding
< transfer-encoding: chunked
< content-type: text/html
Я использую HTTP_Request2 пакет pear как обертка для завитушек, код:
$url = 'http://www.webhostingstuff.com/category/Best-Hosting.html';
$request = new HTTP_Request2 (
$url,
HTTP_Request2::METHOD_GET,
array (
'adapter' => new HTTP_Request2_Adapter_Curl(),
'ssl_verify_peer' => false,
)
);
$request->attach(new HTTP_Request2_Observer_Log('log.txt'));
$result = $request->send();
Ответ 5
0 код означает, что curl не может найти сервер, который вы искали.
"yahoo.com/whatever" вернет 404, а "yahoo.comwhatever" вернется 0.
Ответ 6
Вчера я столкнулся с подобной проблемой. Я потратил 2 часа на эту проблему. Я был в системе RHEL. Код проверки зависания был ниже блока для проверки подлинности:
if($httpCode == 200) {
$_SESSION["username"] = $username;
$_SESSION["password"] = $password;
return array(true, "Login successful. Please wait while you are redirected to home page.");
}else if($httpCode == 401){
return array(false, "Login failure. Incorrect username / password");
}
Этот код использовался для аутентификации. В лабораторной среде он возвратил 200, но на производстве он вернул 0.
Затем я сделал аналогичный script (который использовал curl) и запускался, если из командной строки, как php test3.php
. Результатом этого прогона стал 200
код состояния.
Тогда из любопытства я решил временно отключить SELinux
, выполнив эту команду:
setenforce 0
И угадайте, что это сработало. Затем вы можете правильно настроить контекст, запустив setsebool httpd_can_network_connect on