PHP cURL CODICE HTTP restituisce 0


95

Non capisco quando echo $ httpCode ottengo sempre 0, mi aspettavo 404 quando cambio $ html_brand in un URL non funzionante. C'è qualcosa che mi manca o che non conosco? Grazie.

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

Risposte:


95

Se ti connetti al server, puoi ottenere un codice di ritorno da esso, altrimenti fallirà e otterrai uno 0. Quindi se provi a connetterti a "www.google.com/lksdfk" otterrai un codice di ritorno di 400, se vai direttamente su google.com, otterrai 302 (e poi 200 se vai alla pagina successiva ... beh, lo faccio perché inoltra a google.com.br, quindi potresti non ottenerlo), e se vai su "googlecom" otterrai uno 0 (host non trovato), quindi con l'ultimo, non c'è nessuno a cui inviare un codice.

Testato utilizzando il codice seguente.

<?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
Grazie anche per il refencing della localizzazione, a volte ottengo 301 che è un problema di reindirizzamento.
Ardeus

È strano anche se $ response ha contenuto html, ma $ httpcode restituisce sempre 0, più curl_error è nullo. ciò che potrebbe essere andato storto. Includo solo returntransfer, header (false), followlocation solo nell'impostazione.
Ardeus

Solo per aggiungere, se ci sono spazi bianchi prima o dopo l'URL, verrà anche lanciato http_code = 0
Raja Amer Khan


80

Prova questo dopo curl_exec per vedere qual è il problema:

print curl_error($ch);

Se stampa qualcosa come "malformato", controlla il formato dell'URL.


5
Grazie per quel suggerimento - salvato il mio culo :)
wbj

SÌ! Mi ha salvato il culo.
pimbrouwers

5

controlla curl_error dopo curl_getinfo per scoprire gli errori nascosti.

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

2

Come detto qui e sotto, una richiesta fallita ( cioè il server non è stato trovato ) restituisce false, nessun codice di stato HTTP, poiché una risposta non è mai stata ricevuta.

Chiama curl_error().


2

Ho avuto lo stesso problema e nel mio caso questo era perché la funzione curl_exec è disabilitata in php.ini. Controlla i log:

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

La soluzione è rimuovere curl_exec dalle funzioni disabilitate in php.ini sul file di configurazione del server.


1

Qual è il contenuto esatto che stai passando a $ html_brand?

Se ha una sintassi URL non valida, molto probabilmente otterrai il codice HTTP 0.


1

Prova questo:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);

2
Quando si risponde a una domanda precedente con una risposta accettata, è importante sottolineare il nuovo aspetto della domanda a cui si rivolge la risposta. Inoltre, le risposte solo codice possono essere generalmente migliorate aggiungendo qualche spiegazione su come e perché funzionano. Inoltre, quando si suggerisce a qualcuno di disabilitare la sicurezza, è MOLTO importante spiegare perché e quali sono i rischi.
Jason Aller il

Sebbene questo codice possa rispondere alla domanda, fornire un contesto aggiuntivo su come e / o perché risolve il problema migliorerebbe il valore a lungo termine della risposta.
Paperino

0

Un altro motivo per cui PHP restituisce il codice http 0 è il timeout. Nel mio caso, avevo la seguente configurazione:

curl_setopt ($ http, CURLOPT_TIMEOUT_MS, 500);

Si è scoperto che la richiesta all'endpoint a cui puntavo richiedeva sempre più di 500 ms, sempre in timeout e restituendo sempre il codice http 0.

Se rimuovi questa impostazione (CURLOPT_TIMEOUT_MS) o metti un valore più alto (nel mio caso 5000), otterrai il codice http effettivo, nel mio caso 200 (come previsto).

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.