Почему я получаю HTTP_CODE 0 от curl? - PullRequest
12 голосов
/ 31 июля 2011

Я давно использую 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 (в котором нет ничего, когда скрипт заканчивает загрузку)

Вот функция curl

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 заблокирован)

[brian@ip-184-168-22-244 ~]$ curl -url http://www.webhostingstuff.com/addcomments/5ite.html
Enter host password for user 'rl':
curl: (7) couldn't connect to host
[brian@ip-184-168-22-244 ~]$ 

Как я могу решить эту проблему?

Ответы [ 6 ]

9 голосов
/ 08 августа 2011

Ваша команда

curl -url http://www.webhostingstuff.com/addcomments/5ite.html

должно было быть:

curl --url http://www.webhostingstuff.com/addcomments/5ite.html

cURL считает, что вы указываете опцию -u, которая используется для указания имени пользователя, поэтому вы получили сообщение об ошибке. Вам нужно указать --url (две черты).

Надеюсь, что это поможет при отладке.

8 голосов
/ 07 августа 2011

Код состояния 0 означает, что соединение было закрыто (изящно) до того, как был возвращен какой-либо вывод.

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

3 голосов
/ 06 января 2012

В моем случае http-код 0 возвращался из-за тайм-аута соединения.Добавив

curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20);

, я смог избавиться от ошибки

0 голосов
/ 28 января 2017

Вчера я столкнулся с подобной проблемой.Я потратил 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.

Затем я сделал похожий скрипт (который использовал curl) и запустил его из командной строки, как php test3.php.Этот запуск привел к 200 коду состояния.

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

setenforce 0

И угадайте, как это сработало.Затем вы можете правильно установить контекст, выполнив setsebool httpd_can_network_connect on

0 голосов
/ 24 марта 2014

0 код означает, что curl не может найти сервер, который вы искали. «yahoo.com/whwhat» вернет 404, а «yahoo.comwhwhat» вернет 0.

0 голосов
/ 31 июля 2011

Может быть, это была какая-то внутренняя ошибка сервера? Прямо сейчас это работает:

> 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 грушевый пакет в качестве оболочки curl, код:

$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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...