Возникла необходимость проверить сайт - включен ли он ? Проблемы : 1. Сайтов много, а у меня рейтинг : выводится 50 штук на страницу. Т.е. если я пишу так : PHP: $try_access = fsockopen($row['S_ip'], $row['S_port'], &$errno, &$errstr, 1); то на каждый сайт отводится 1 секунда. Итого : 50 секунд ожидания 0_o. 2. Как скрыть ошибки этой функции? Достаточно ли просто @fsockopen, чтобы сайт не перекошивало и не писало лишний текст аля нельзя подключиться?
Сделать функции проверки сайтов в отдельном файле и запускать его по cron. Ошибки видеть никто не будет, задержка 50 сек тоже волновать никого не будет.
Т.е. записывать информацию в БД? Вот пользователь зашёл и видит список : а в нём должно быть отражено - включен сайт или нет.
PHP: <?php $sites = array_map('parse_url', file("файл_с_урлами.txt")); /** пример что должно быть в файле: * http://google.ru:80 * http://fuck.ru:666 */ $result = ""; foreach($sites as $url) $result .= @fsockopen($url['host'], $url['port'], $errno, $errstr, 1) ? $url['host']." доступен\n" : $url['host']." не доступен\n"; file_put_contents('result.txt', $result); ?> это на крон, как писали выше на странице где надо список просто PHP: <?php echo file_get_contents('result.txt'); ?>
По cron запускать скажем раз в 10 минут скрипт, который будет обновлять информацию в БД. А основной сайт просто будет выводить оттуда ее. Пример привели выше.
Спасибо большое, а можно примерчик под MySQL ? Мне всегда говорили, что файлы для аудитории менее 100 человек, у меня намного больше.
=\ проблема самому переделать под бд? PHP: <?php /** mysql> describe `sites`; +--------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------+--------------+------+-----+---------+----------------+ | id | int(3) | NO | PRI | NULL | auto_increment | | url | varchar(256) | YES | | NULL | | | status | int(1) | YES | | 0 | | +--------+--------------+------+-----+---------+----------------+ 3 rows in set (0.00 sec) */ mysql_connect(localhost, root, pass); mysql_select_db(site); $result = mysql_query("SELECT * FROM `sites`"); while($row = mysql_fetch_assoc($result)) $sites[] = $row['url']; $sites = array_map('parse_url', $sites); foreach($sites as $key=>$url) { $status = @fsockopen($url['host'], $url['port'], $errno, $errstr, 1) ? 1 : 0; mysql_query("UPDATE `sites` SET `status`='{$status}' WHERE `id`='{$key}'"); } ?> это на крон, на страничке выводить так: PHP: <?php //mysql_connect $result = mysql_query("SELECT * FROM `sites`"); while($row = mysql_fetch_assoc($result)) { $row['url'] = parse_url($row['url']); echo $row['status'] ? $row['url']['host']." доступен\n" : $row['url']['host']." не доступен"; } ?> Выглядит так: Code: mysql> SELECT * FROM `sites`; +----+-----------------------+--------+ | id | url | status | +----+-----------------------+--------+ | 0 | http://google.ru:80 | 1 | | 1 | http://antichat.ru:80 | 1 | | 2 | https://rdot.org:443 | 1 | | 3 | http://ya.ru:80 | 1 | | 4 | http://fuck.you:22 | 0 | +----+-----------------------+--------+
Еще вариант попросить написать на Перле многопоточный, время ожидания значительно сократиться, до 5-8 секунд, и стата будет в рил-тайме.