Как вы получаете код состояния HTTP для удаленного домена в php? - PullRequest
6 голосов
/ 07 ноября 2008

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

Желательно не использовать curl, так как он у меня не установлен.

Ответы [ 5 ]

13 голосов
/ 07 ноября 2008

CURL был бы идеальным, но так как у вас его нет, вам придется опуститься и запачкаться в гнездах Техника:

  1. Открыть сокет для сервера.
  2. Отправьте запрос HTTP HEAD.
  3. Разбор ответа.

Вот краткий пример:

<?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

2 голосов
/ 07 ноября 2008

Если я не ошибаюсь, ни одна из встроенных функций 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, который может возвращать заголовки без извлечения полного содержимого страницы, в сети должно быть несколько классов с открытым исходным кодом ...

1 голос
/ 07 ноября 2008

Вы можете использовать функцию PEAR HTTP :: head.
http://pear.php.net/manual/en/package.http.http.head.php

1 голос
/ 07 ноября 2008

Эта страница выглядит довольно неплохо для загрузки страницы, используя curl или fsockopen, и может получить заголовки HTTP, используя любой из этих методов (что вам действительно нужно).

После использования этого метода вы захотите проверить $ output ['info'] ['http_code'], чтобы получить нужные данные.

Надеюсь, это поможет.

0 голосов
/ 07 ноября 2008

http://www.webmasterworld.com/forum88/12559.htm быстрый поиск в Google нашел эту ссылку. Самая актуальная версия находится внизу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...