Ottieni http-statuscode senza il corpo usando cURL?

Voglio analizzare molti URL per get solo i loro codici di stato.

Quindi quello che ho fatto è:

$handle = curl_init($url -> loc); curl_setopt($handle, CURLOPT_RETURNTRANSFER, true); curl_setopt($handle, CURLOPT_HEADER , true); // we want headers curl_setopt($handle, CURLOPT_NOBODY , true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); $response = curl_exec($handle); $httpCode = curl_getinfo($handle, CURLINFO_HTTP_CODE); curl_close($handle); 

Ma non appena l'opzione "nessuno" è impostata su true, i codici di stato restituiti non sono corretti (google.com restituisce 302, altri siti restituiscono 303).

L'impostazione di questa opzione su false non è ansible a causa della perdita di performance.

Qualche idea?

Il metodo di richiesta HTTP predefinito per arricciare è GET . Se si desidera solo le intestazioni di risposta, è ansible utilizzare il metodo HTTP HEAD .

 curl_setopt($handle, CURLOPT_CUSTOMREQUEST, 'HEAD'); 

Secondo la risposta di @ Dai, NESSUNO sta già utilizzando il metodo HEAD. Quindi il metodo sopra non functionrà.

Un'altra opzione sarebbe quella di usare fsockopen per aprire una connessione, scrivere le intestazioni usando fwrite . Leggi la risposta usando fgets fino alla prima occorrenza di \r\n\r\n per get l'intestazione completa. Poiché è necessario solo il codice di stato, è sufficiente leggere i primi 13 caratteri.

 <?php $fp = fsockopen("www.google.com", 80, $errno, $errstr, 30); if ($fp) { $out = "GET / HTTP/1.1\r\n"; $out .= "Host: www.google.com\r\n"; $out .= "Accept-Encoding: gzip, deflate, sdch\r\n"; $out .= "Accept-Language: en-GB,en-US;q=0.8,en;q=0.6\r\n"; $out .= "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36\r\n"; $out .= "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r\n"; $out .= "Connection: Close\r\n\r\n"; fwrite($fp, $out); $tmp = explode(' ', fgets($fp, 13)); echo $tmp[1]; fclose($fp); } 

L'opzione di nobody di CURL ha il verbo HTTP HEAD , io scommetterei la maggior parte delle applicazioni web non statiche. I wild non gestiscono correttamente questo verbo, quindi i problemi che stai vedendo con risultati diversi. Suggerisco di fare una normale richiesta GET e di scartare la risposta.

suggerisco invece get_headers() :

 <?php $url = 'http://www.example.com'; print_r(get_headers($url)); print_r(get_headers($url, 1)); ?>