В этой статье я расскажу о том, как я делал проверку базы данных сайтов каталога на доступность. В коде используется функция 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 и т.п.
}
// Возвращаем результат
}
?>
Вот схематичное изложение моего скрипта. Надеюсь вам это поможет.
После того как написана основа, можно навесить дополнительные функции, например, при запуске проверки по крону, записывать результат в базу данных и, если сайт не прошел трех проверок - удалять его.