Forum Webscript.Ru
Программирование => PHP => Тема начата: Lion от 25 Марта 2002, 13:50:06
-
Как наиболее быстро и рационально провести проверку ссылок (несколько тысяч).
-
Боюсь - быстро не получится, ибо надо будет проанализировать ответ (а там, помимо 404, может быть и редирект), да ещо сервера могут быть временно недоступны, да ещо ДНС-ы могут завернуты раком - в общем - быстро тут не катит.
-
Как наиболее быстро и рационально провести проверку ссылок (несколько тысяч).
какая именно задача стоит?
проверить правильность написания в соответствии с форматом или еще и сделать запрос на сервер?
если на правильность, то с помощью регулярных выражений.
см. пример на php.spb.ru
-
соответствии с форматом или еще и сделать запрос на сервер?
Задача очень простая, нужно проверить жив ли сайт на который ссылается ссылка, т.е. отдает ли сервер код 200. Мне это все для каталога нужно.
-
для каталога обычно такую проверку осуществляют, когда посетитель пытается перейти по этой ссылке. если ссылка дохлая - об этом сообщается администратору, который потом ее вручную проверяет еще раз для верности и удаляет
-
полностью согласен с AliMamed.
Lion, скорее всего в данном случае нужно использовать HEAD запросы. минимум трафика. статус сразу можно определить.
-
Не знаю быстро будет или нет, но вот тебе примерчик проверки...
function check_url($url) {
if (eregi( \'^http://\', $url)) {
$urlArray = parse_url($url);
if (!$urlArray[port]) $urlArray[port] = \'80\';
if (!$urlArray[path]) $urlArray[path] = \'/\';
$sock = fsockopen($urlArray[host], $urlArray[port], &$errnum,
&$errstr);
if (!$sock) $res = \'DNS\';
else {
$dump .= "GET $urlArray[path] HTTP/1.1\\r\\n";
$dump .= "Host: $urlArray[host]\\r\\nConnection: close\\r\\n";
$dump .= "Connection: close\\r\\n";
fputs($sock, $dump);
while ($str = fgets($sock, 1024)) {
if (eregi("^http/[0-9]+.[0-9]+ ([0-9]{3}) [a-z ]*", $str))
$res = trim(eregi_replace(\'^http/[0-9]+.[0-9]+([0-9]{3})[a-z
]*\',
"\\\\1", $str));
if (eregi("^Content-Type: ", $str))
$res[contentType] = trim(eregi_replace("^Content-Type: ",
"",
$str));
}
fclose($sock);
flush();
return $res;
}
} else $res = "N/A";
return $res;
}
?>
-
только можно использовать HEAD запросы и убрать лишний eregi.