При разработке скриптов нередко возникает необходимость проверить существование веб-страницы на удаленном сервере. Это можно сделать несколькими способами.
Если надо проверить только факт существования страницы можно ипользовать функцию 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)) {...} (или чего-то подобного) сокращает загружаемый объем данных. Загрузка может быть прервана, как только будет обнаружено контрольное значение.
Сгинули все инопланетяне... Надоели мы им...
Круто!!!