Проверка ссылок на доступность

В этой статье я расскажу о том, как я делал проверку базы данных сайтов каталога на доступность. В коде используется функция fsockopen и запуск скрипта самим собой (для обхода ограничения по времени на выполнение программы).

Итак, у нас есть таблица url (например, каталог сайтов):

1   http://url.com
2   http://url1.com
3   http://url2.com
...

Создадим скрипт check.php при отправке на который post данных action:check, он инициализирует начало проверки, то бишь запускает сам скрипт проверки (создадим его чуть позже):

<?php
if ($_POST['action'] != 'check') die('Nou!');
$result = openURL($_SERVER['SERVER_NAME'], '/check1.php');
if ($result[0] == 0) {
    die($result[1]);
}
?>

Функция openURL описывается так:

<?php
function openURL($host, $url) {
    $fp = fsockopen($host, 80, $errno, $errstr, 30);
    if (!$fp) {
        return array(0, $errstr.' ['.$errno.']');
    }else {
        $out = "GET $url HTTP/1.1\r\n";
        $out .= "Host: $host\r\n";
        $out .= "Connection: Close\r\n\r\n";
        fwrite($fp, $out);
        fclose($fp);
        return array(1, "");
    }
}
?>

Теперь будем писать скрипт check1.php (он будет запускать сам себя):

<?php
$j = isset($_GET['j']) ? $_GET['j'] : 0; //определяем на каком мы шагу
//Здесь пишем в лог начало итерации №j
//Здесь получаем полное число сайтов в базе(включая уже проверенные) $totalsites;
for ($i = 1; $i <= 10; $i ++) {
    if ($totalsites <= ($j * 10 + $i - 1)) {
        //Здесь пишем в лог конец проверки
        break 1;
    }
    $cur_site = $j * 10 + $i - 1; //Порядковый номер текущего сайта в базе (не id)
    $result = checkSite($cur_site);
    //Здесь обработка результатов проверки (запись в лог и тп)
}
//Здесь пишем в лог результаты проверки сайтов и конец итерации №j
$j ++; //Увеличиваем счетчик и запускаем скрипт заново
openURL($_SERVER['SERVER_NAME'], '/admin/check1.php?j='.$j);
?>

Сердце нашего скрипта - функция checkSite($cur_site):

<?php
function checkSite($cur) {
    $id    	 = //Получаем из БД
    $url     = //Получаем из БД
    // Здесь проверяем УРЛ на синтаксическую верность
    // Соединяемся с сайтом
    $fp = @fsockopen($url_info['host'], 80, $errno, $errstr, 10);
    if (!$fp) {
        return "Не удается установить соединение";
    }
    // Составляем запрос (HEAD - значит узнать существует запрашиваемый файл или нет)
    $out = "HEAD / HTTP/1.1\r\n";
    $out .= "Host: ".$url_info['host']."\r\n";
    $out .= "Connection: Close\r\n\r\n";
    fwrite($fp, $out);
    $server_response = array();
    while ($line = trim(fgets($fp, 128))) {
        if ($line) {
            array_push($server_response, $line);
        }
    }
    fclose($fp);
    $response = implode("\n", $server_response);
    foreach($server_response as $v) {
        // Здесь проводим всякие проверки на 404, 301, 302 и т.п.
    }
    // Возвращаем результат
}
?>

Вот схематичное изложение моего скрипта. Надеюсь вам это поможет.

После того как написана основа, можно навесить дополнительные функции, например, при запуске проверки по крону, записывать результат в базу данных и, если сайт не прошел трех проверок - удалять его.

Теги: 

Добавить комментарий

Filtered HTML

  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Разрешённые HTML-теги: <a> <em> <i> <strong> <b> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd> <p> <br>
  • Строки и параграфы переносятся автоматически.

Plain text

  • HTML-теги не обрабатываются и показываются как обычный текст
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Строки и параграфы переносятся автоматически.
CAPTCHA
CAPTCHA на основе изображений
Введите код с картинки