Я хотел бы создать пакетный скрипт, чтобы пройти 20 000 ссылок в БД и отсеять все 404 и тому подобное. Как мне получить код состояния HTTP для удаленного URL-адреса?
Желательно не использовать curl, так как он у меня не установлен.






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);
?>
ОБНОВЛЕНИЕ: я добавил несколько строк для анализа URL-адреса
Спасибо, что заметил этого Шона. Я исправлю эту маленькую опечатку.
Я должен отметить, что не все веб-серверы поддерживают или разрешают запросы HEAD, даже если вероятность их выполнения близка к нулю ...
Эта страница выглядит так, как будто у него довольно хорошая настройка для загрузки страницы с помощью curl или fsockopen, и он может получать заголовки HTTP, используя любой метод (что вы действительно хотите).
После использования этого метода вы захотите проверить $ output ['info'] ['http_code'], чтобы получить нужные данные.
Надеюсь, это поможет.
Вы можете использовать функцию PEAR HTTP :: head. http://pear.php.net/manual/en/package.http.http.head.php
Если я не ошибаюсь, ни одна из встроенных функций php не возвращает http-статус удаленного URL-адреса, поэтому лучшим вариантом будет использование сокетов для открытия соединения с сервером, отправки запроса и анализа статуса ответа:
псевдокод:
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)
Другой вариант - использовать уже созданный клиентский класс http в php, который может возвращать заголовки без извлечения полного содержимого страницы, в сети должно быть несколько классов с открытым исходным кодом ...
Я считаю, что это:. "Host: $ host \ r \ n \" (т.е. не% host) Но в остальном это будет работать хорошо.