Как получить код состояния HTTP для удаленного домена на php?

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
6
0
12 380
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

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-адреса

Я считаю, что это:. "Host: $ host \ r \ n \" (т.е. не% host) Но в остальном это будет работать хорошо.

Sean Schulte 07.11.2008 04:30

Спасибо, что заметил этого Шона. Я исправлю эту маленькую опечатку.

Adam Pierce 07.11.2008 04:43

Я должен отметить, что не все веб-серверы поддерживают или разрешают запросы HEAD, даже если вероятность их выполнения близка к нулю ...

J.C. Inacio 07.11.2008 06:02

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

Другие вопросы по теме