Доброго времени суток. Возникла тут необходимость мониторить состояние имеющихся сайтов, чтобы знать, когда чего-нить падает. В инете было нарыто нехитрое решение, слегка доработал напильником и получилось вот: Код (Text): <?php $list = fopen('list.txt', 'r'); ini_set('default_socket_timeout', '10'); if ($list) { while (!feof($list)) { $site = 'www.'.fgets($list, 999); $site = rtrim($site); $site = 'http://'.$site.'/'; echo($site.' '); $check = fopen($site, "r"); $res = fread($check, 100); fclose($check); if (strlen($res) > 0) echo 'Сайт '.$site.' доступен<br />'; else echo 'Сайт '.$site.' не доступен<br />'; } } else echo "Ошибка при открытии файла"; fclose($list); ?> Описалово с первоисточника: "Скрипт пытается прочитать страницу по заданному url. Если ответ от сервера с содержимым не поступит в течении 10 секунд, сайт или то, что запрошено, будет считаться не доступным" Необходимые пояснения: list.txt - список проверяемых адресов rtrim - чтобы отгрызть последний символ в строке, без этого fopen отказывается жрать название Скрипт вполне себе работает. Но! Возникли некоторые сложности. 1) Очень большое время исполнения. Для 30 сайтов - больше двух минут. Есть ли варианты пошустрее? 2) Вытекающее из первого - как сделать, чтобы скрипт выводил результат по мере выполнения? Проверили мы сайт - появилась сразу соответствующая надпись о его доступности/недоступности. 3) Некоторые вполне рабочие сайты при таком методе проверки выдают недоступность. Нашел закономерность - при чтении через php у них в заголовке 301 ошибка, при этом с браузера загрузка без проблем. Ну и вообще, любым мыслям по этой теме буду рад =)
)) ну так передел мира идёт вчера я начинал писать варианты решения, да отвлекся Один из вариантов вообще в сторону - почему бы не написать программульку на C#, в которой эти запросы делать параллельно, а результат обрабатывать в eventHаndler-функциях? Нужно именно на PHP? Попробуй так. Долго будет? Код (PHP): <?php ini_set('default_socket_timeout', '10'); $list = file('list.txt'); foreach ($list as $site) { $site = rtrim($site); $site = 'http://www.' . $site; echo "site: $site<br/>\n"; $check = fopen($site, "r"); $res = fread($check, 100); fclose($check); if (strlen($res) > 0) echo 'Сайт ' . $site . ' доступен<br />'; else echo 'Сайт ' . $site . ' не доступен<br />'; } Просто модификация твоего кода. Ещё можно попробовать через curl_multi_exec
а я тут писал вчера, отправить нажал а иннет то пропал(( вот и лень стало заново писать сообщение) Добавлено спустя 49 секунд: a file_get_content?
Пхп совсем необязательно, рассматриваю варианты. На пыхе легче всего найти было просто =) Курл на очереди, он как раз умеет запросы как браузер генерить, может и получится решить проблему с 301-й. Приду домой - попробую обязательно =) Хотя по моим тестам узкое место - это как раз получение тех самых ста символов с сайта($res = fread($check, 100), остальное выполняется почти мгновенно. Добавлено спустя 2 минуты 7 секунд: И file_get_content, и get_headers дают примерно одинаковую производительность =\ Причём дело не в толщине канала - там 25 мегабит на входе. (оффтоп) почему у вас в сообщении код с подсветкой синтаксиса, а у меня без? О_о