我想创建一个批处理脚本,在数据库中浏览20,000个链接,并清除所有404等。我如何获取远程URL的HTTP状态代码?
最好不要使用卷曲,因为我没有安装它。
答案 0 :(得分:13)
CURL会很完美但是因为你没有它,你将不得不陷入肮脏的插座。该技术是:
这是一个简单的例子:
<?php
$url = parse_url('http://www.example.com/index.html');
$host = $url['host'];
$port = $url['port'];
$path = $url['path'];
$query = $url['query'];
if(!$port)
$port = 80;
$request = "HEAD $path?$query HTTP/1.1\r\n"
."Host: $host\r\n"
."Connection: close\r\n"
."\r\n";
$address = gethostbyname($host);
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, $address, $port);
socket_write($socket, $request, strlen($request));
$response = split(' ', socket_read($socket, 1024));
print "<p>Response: ". $response[1] ."</p>\r\n";
socket_close($socket);
?>
更新:我添加了几行来解析网址
答案 1 :(得分:2)
如果我没记错,没有php内置函数返回远程url的http状态,所以最好的选择是使用套接字打开与服务器的连接,发送请求并解析响应状态:
伪代码:
parse url => $host, $port, $path
$http_request = "GET $path HTTP/1.0\nHhost: $host\n\n";
$fp = fsockopen($host, $port, $errno, $errstr, $timeout), check for any errors
fwrite($fp, $request)
while (!feof($fp)) {
$headers .= fgets($fp, 4096);
$status = <parse $headers >
if (<status read>)
break;
}
fclose($fp)
另一种选择是在php中使用已经构建的http客户端类,它可以在不获取整页内容的情况下返回标题,网上应该有一些开源类...
答案 2 :(得分:1)
This page看起来它有一个非常好的设置,可以使用curl或fsockopen下载页面,并且可以使用任一方法获取HTTP标头(这正是你想要的,真的)。
使用该方法后,您需要检查$ output ['info'] ['http_code']以获取所需的数据。
希望有所帮助。
答案 3 :(得分:1)
您可以使用PEAR的HTTP :: head功能 http://pear.php.net/manual/en/package.http.http.head.php
答案 4 :(得分:0)
http://www.webmasterworld.com/forum88/12559.htm谷歌搜索了一下这个链接。最新版本接近底部。