使用cURL获取不带正文的http-statuscode?
我想解析很多URL,以便仅获取其状态代码.
I want to parse a lot of URLs to only get their status codes.
所以我所做的是:
$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);
但是,只要将"nobody"选项设置为true,返回的状态代码就不正确(google.com返回302,其他网站返回303).
But as soon as the "nobody"-option is set to true, the returned status codes are incorrect (google.com returns 302, other sites return 303).
由于性能下降,无法将此选项设置为false.
Setting this option to false is not possible because of the performance loss.
有什么想法吗?
curl的默认HTTP请求方法是GET
.如果只需要响应头,则可以使用HTTP方法HEAD
.
The default HTTP request method for curl is GET
. If you want only the response headers, you can use the HTTP method HEAD
.
curl_setopt($handle, CURLOPT_CUSTOMREQUEST, 'HEAD');
根据@Dai的回答,NOBODY已经在使用HEAD方法.因此上述方法无效.
According to @Dai's answer, the NOBODY is already using the HEAD method. So the above method will not work.
另一个选择是使用fsockopen
打开连接,使用fwrite
编写标题.使用fgets
读取响应,直到第一次出现\r\n\r\n
为止,以获取完整的标头.由于只需要状态码,因此只需要读取前13个字符即可.
Another option would be to use fsockopen
to open a connection, write the headers using fwrite
. Read the response using fgets
until the first occurrence of \r\n\r\n
to get the complete header. Since you need only the status code, you just need to read the first 13 characters.
<?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);
}