PHP cURL HTTP CODE retornar 0

95

Eu não entendo quando eu echo $ httpCode eu sempre obtenho 0, eu esperava 404 quando eu altero $ html_brand em um url quebrado. Há algo que eu sinto falta ou não sei? Obrigado.

 //check if url exist
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $html_brand);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$response = curl_exec($ch); 
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

if ($httpCode == 404) {
    echo "The Web Page Cannot Be Found";
    return;
}
curl_close($ch);
Ardeus
fonte

Respostas:

95

Se você se conectar ao servidor, poderá obter um código de retorno dele, caso contrário, ele falhará e você obterá um 0. Portanto, se tentar se conectar a "www.google.com/lksdfk", obterá um código de retorno de 400, se você for diretamente para google.com, obterá 302 (e, em seguida, 200 se encaminhar para a próxima página ... bem, eu faço porque ele encaminha para google.com.br, então você pode não conseguir isso), e se você for para "googlecom" obterá um 0 (host não encontrado), então com o último, não há ninguém para enviar o código de volta.

Testado usando o código abaixo.

<?php

$html_brand = "www.google.com";
$ch = curl_init();

$options = array(
    CURLOPT_URL            => $html_brand,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HEADER         => true,
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_ENCODING       => "",
    CURLOPT_AUTOREFERER    => true,
    CURLOPT_CONNECTTIMEOUT => 120,
    CURLOPT_TIMEOUT        => 120,
    CURLOPT_MAXREDIRS      => 10,
);
curl_setopt_array( $ch, $options );
$response = curl_exec($ch); 
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

if ( $httpCode != 200 ){
    echo "Return code is {$httpCode} \n"
        .curl_error($ch);
} else {
    echo "<pre>".htmlspecialchars($response)."</pre>";
}

curl_close($ch);
craniumonempty
fonte
1
Também obrigado por refencing followlocation também, às vezes eu recebo 301 que é um problema de redirecionamento.
Ardeus de
É estranho, embora $ response tenha conteúdo html, mas o $ httpcode sempre retorna 0, mais o curl_error é nulo. o que poderia dar errado. Eu incluo apenas returntransfer, header (false), followlocation somente na configuração.
Ardeus
Só para adicionar, se houver algum espaço em branco antes ou depois do URL, ele também exibirá http_code = 0
Raja Amer Khan
80

Tente fazer isso depois de curl_exec para ver qual é o problema:

print curl_error($ch);

Se for impresso algo como 'malformado', verifique o formato do seu URL.

Hereblur
fonte
5
Obrigado por essa sugestão - salvou minha bunda :)
wbj
SIM! Salvei minha bunda.
pimbrouwers
5

verifique o curl_error após o curl_getinfo para descobrir os erros ocultos.

if(curl_errno($ch)){   
    echo 'Curl error: ' . curl_error($ch);
}
Daniel
fonte
2

Como disse aqui e abaixo, uma solicitação com falha ( ou seja, o servidor não foi encontrado ) retorna falso, nenhum código de status HTTP, uma vez que uma resposta nunca foi recebida.

Ligue curl_error().

CodeCaster
fonte
2

Eu tive o mesmo problema e no meu caso foi porque a função curl_exec está desabilitada no php.ini. Verifique se há registros:

PHP Warning:  curl_exec() has been disabled for security reasons in /var/www/***/html/test.php on line 18

A solução é remover curl_exec das funções desabilitadas em php.ini no arquivo de configuração do servidor.

Gondy
fonte
1

Qual é o conteúdo exato que você está passando para $ html_brand?

Se tiver uma sintaxe de URL inválida, você provavelmente obterá o código HTTP 0.

psynnott
fonte
1

Experimente isto:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
Meldo
fonte
2
Ao responder a uma pergunta mais antiga com uma resposta aceita, é importante apontar qual novo aspecto da pergunta sua resposta aborda. Além disso, as respostas apenas de código geralmente podem ser melhoradas com a adição de alguma explicação de como e por que funcionam. Além disso, ao sugerir que alguém desative a segurança, é MUITO importante explicar por que e quais são os riscos.
Jason Aller
Embora este código possa responder à pergunta, fornecer contexto adicional sobre como e / ou por que ele resolve o problema melhoraria o valor da resposta a longo prazo.
Pato Donald
0

Outro motivo para o PHP retornar o código http 0 é o tempo limite. No meu caso, tinha a seguinte configuração:

curl_setopt ($ http, CURLOPT_TIMEOUT_MS, 500);

Acontece que a solicitação para o endpoint para o qual eu estava apontando sempre demorava mais de 500 ms, sempre expirando e sempre retornando o código http 0.

Se você remover esta configuração (CURLOPT_TIMEOUT_MS) ou colocar um valor mais alto (no meu caso 5000), você obterá o código http real, no meu caso 200 (como esperado).

Veja https://www.php.net/manual/en/function.curl-setopt.php

Alejandro Hdez. Angeles
fonte