Forum Webscript.Ru

Программирование => PHP => Тема начата: Lion от 25 Марта 2002, 13:50:06

Название: проверка ссылок
Отправлено: Lion от 25 Марта 2002, 13:50:06
Как наиболее быстро и рационально провести проверку ссылок (несколько тысяч).
Название: проверка ссылок
Отправлено: BigHarry от 25 Марта 2002, 15:45:55
Боюсь - быстро не получится, ибо надо будет проанализировать ответ (а там, помимо 404, может быть и редирект), да ещо сервера могут быть временно недоступны, да ещо ДНС-ы могут завернуты раком - в общем - быстро тут не катит.
Название: проверка ссылок
Отправлено: Dm от 25 Марта 2002, 17:39:39
Цитировать
Как наиболее быстро и рационально провести проверку ссылок (несколько тысяч).

какая именно задача стоит?
проверить правильность написания в соответствии с форматом или еще и сделать запрос на сервер?
если на правильность, то с помощью регулярных выражений.
см. пример на php.spb.ru
Название: проверка ссылок
Отправлено: Lion от 25 Марта 2002, 17:48:10
Цитировать
соответствии с форматом или еще и сделать запрос на сервер?

Задача очень простая, нужно проверить жив ли сайт на который ссылается ссылка, т.е. отдает ли сервер код 200. Мне это все для каталога нужно.
Название: проверка ссылок
Отправлено: AliMamed от 25 Марта 2002, 17:51:04
для каталога обычно такую проверку осуществляют, когда посетитель пытается перейти по этой ссылке. если ссылка дохлая - об этом сообщается администратору, который потом ее вручную проверяет еще раз для верности и удаляет
Название: проверка ссылок
Отправлено: Dm от 25 Марта 2002, 18:03:28
полностью согласен с AliMamed.


Lion, скорее всего в данном случае нужно использовать HEAD запросы. минимум трафика. статус сразу можно определить.
Название: проверка ссылок
Отправлено: Ancient от 25 Марта 2002, 23:09:38
Не знаю быстро будет или нет, но вот тебе примерчик проверки...

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;
}

?>
Название: проверка ссылок
Отправлено: Dm от 25 Марта 2002, 23:22:52
только можно использовать HEAD запросы и убрать лишний eregi.