Practical developers (dexSoft.ru)
Домены

Рейтинг

Метки

Сервис

Обсуждения

Марс атакует!
Сгинули все инопланетяне... Надоели мы им...

Статистика

 

Статьи > PHP

Проверка существования веб-страницы

05 июль 2009 14:15, рейтинг: 15679, автор: EloSoft

При разработке скриптов нередко возникает необходимость проверить существование веб-страницы на удаленном сервере. Это можно сделать несколькими способами.

Если надо проверить только факт существования страницы можно ипользовать функцию get_headers. Достоинство этого метода в минимуме объема передаваемого/принимаемого обмена данных. Недостаток в том, что содержание ответа разных серверов могут различаться.

$heads = get_headers('http://example.com');

В качестве ответа сервера будет получен массив. Вид массива и его данные могут различаться для разных серверов.

Вариант ответа сервера 1.

[0] => HTTP/1.1 200 OK
[1] => Date: Sat, 29 May 2004 12:28:13 GMT
[2] => Server: Apache/1.3.27 (Unix) (Red-Hat/Linux)
[3] => Last-Modified: Wed, 08 Jan 2003 23:11:55 GMT
[4] => ETag: "3f80f-1b6-3e1cb03b"
[5] => Accept-Ranges: bytes
[6] => Content-Length: 438
[7] => Connection: close
[8] => Content-Type: text/html

Вариант ответа сервера 2.

[0] => HTTP/1.1 200 OK
[Date] => Sat, 29 May 2004 12:28:14 GMT
[Server] => Apache/1.3.27 (Unix)  (Red-Hat/Linux)
[Last-Modified] => Wed, 08 Jan 2003 23:11:55 GMT
[ETag] => "3f80f-1b6-3e1cb03b"
[Accept-Ranges] => bytes
[Content-Length] => 438
[Connection] => close
[Content-Type] => text/html

Далее можно проанализировать данные полученного массива например так:

if (is_array($heads) and strpos($heads[0], '200') !== false) {...

Если надо проверить не только сам факт существования страницы, но и ее содержание, можно использовать функции для работы с удаленными файлами.

$fh = fopen('http://example.com/index.php', 'rb');
if ($fh) {
  $liine = '';
  while (!feof($fh)) {
    $line .= fgets($fh, 1024);
    if (eregi(выражение_для_проверки, $line, $out)) {
    ...
    }
  }
}

Вариант с использованием сокета.

$url = 'http://example.com/index.php';
if (($sc = fsockopen($url, 80, $errno, $errstr, 5)) !== false) {
  $request = "GET / HTTP/1.1\r\n";
  $request .= "Host: ".$url."\r\n";
  $request .= "User-Agent: Mozilla/5.0 (MyAgent)\r\n";
  $request .= "Referer:
http://".$url."/\r\n";
  $request .= "Accept: text/html, application/xml;q=0.9, */*;q=0.1\r\n";
  $request .= "Expires: Thu, 01 Jan 1970 00:00:01 GMT\r\n";
  $request .= "Cache-Control: no-store, no-cache, must-revalidate\r\n";
  $request .= "Pragma: no-cache\r\n";
  $request .= "Cookie: income=1\r\n";
  $request .= "Connection: Close\r\n";
  $request .= "\r\n";
  fputs($sc, $request);
  $liine = '';
  while (!feof($fh)) {
    $line .= fgets($fh, 1024);
    if (eregi(выражение_для_проверки, $line, $out)) {
      ...
    }
  }
}


Использование выражения if (eregi(выражение_для_проверки, $line, $out)) {...} (или чего-то подобного) сокращает загружаемый объем данных. Загрузка может быть прервана, как только будет обнаружено контрольное значение.