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

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

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.


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

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().


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.


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.


1

Experimente isto:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.