За последние 24 часа нас посетил 23181 программист и 1516 роботов. Сейчас ищут 859 программистов ...

Проверка доступности - опять банальщина %)

Тема в разделе "Прочие вопросы по PHP", создана пользователем unrecovered, 6 мар 2014.

  1. unrecovered

    unrecovered Новичок

    С нами с:
    24 янв 2014
    Сообщения:
    45
    Симпатии:
    0
    Доброго времени суток. Возникла тут необходимость мониторить состояние имеющихся сайтов, чтобы знать, когда чего-нить падает.

    В инете было нарыто нехитрое решение, слегка доработал напильником и получилось вот:
    Код (Text):
    1.  
    2. <?php
    3. $list = fopen('list.txt', 'r');
    4. ini_set('default_socket_timeout', '10');
    5. if ($list)
    6.     {
    7.      while (!feof($list))
    8.         {
    9.          $site = 'www.'.fgets($list, 999);
    10.          $site = rtrim($site);
    11.          $site = 'http://'.$site.'/';
    12.          echo($site.' ');
    13.          $check = fopen($site, "r");
    14.          $res = fread($check, 100);
    15.          fclose($check);
    16.          if (strlen($res) > 0)
    17.              echo 'Сайт '.$site.' доступен<br />';
    18.          else
    19.              echo 'Сайт '.$site.' не доступен<br />';
    20.  
    21.         }
    22.     }
    23. else echo "Ошибка при открытии файла";
    24. fclose($list);
    25.  
    26. ?>
    Описалово с первоисточника:
    "Скрипт пытается прочитать страницу по заданному url. Если ответ от сервера с содержимым не поступит в течении 10 секунд, сайт или то, что запрошено, будет считаться не доступным"

    Необходимые пояснения:
    list.txt - список проверяемых адресов
    rtrim - чтобы отгрызть последний символ в строке, без этого fopen отказывается жрать название

    Скрипт вполне себе работает. Но! Возникли некоторые сложности.

    1) Очень большое время исполнения. Для 30 сайтов - больше двух минут. Есть ли варианты пошустрее?
    2) Вытекающее из первого - как сделать, чтобы скрипт выводил результат по мере выполнения? Проверили мы сайт - появилась сразу соответствующая надпись о его доступности/недоступности.
    3) Некоторые вполне рабочие сайты при таком методе проверки выдают недоступность. Нашел закономерность - при чтении через php у них в заголовке 301 ошибка, при этом с браузера загрузка без проблем.

    Ну и вообще, любым мыслям по этой теме буду рад =)
     
  2. unrecovered

    unrecovered Новичок

    С нами с:
    24 янв 2014
    Сообщения:
    45
    Симпатии:
    0
    Серьёзно? За целый день ни одного коммента?!
     
  3. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    )) ну так передел мира идёт
    вчера я начинал писать варианты решения, да отвлекся
    Один из вариантов вообще в сторону - почему бы не написать программульку на C#, в которой эти запросы делать параллельно, а результат обрабатывать в eventHаndler-функциях? Нужно именно на PHP?


    Попробуй так. Долго будет?
    Код (PHP):
    1. <?php
    2. ini_set('default_socket_timeout', '10');
    3. $list = file('list.txt');
    4. foreach ($list as $site) {
    5.     $site = rtrim($site);
    6.     $site = 'http://www.' . $site; echo "site: $site<br/>\n";
    7.     $check = fopen($site, "r");
    8.     $res = fread($check, 100);
    9.     fclose($check);
    10.     if (strlen($res) > 0)
    11.         echo 'Сайт ' . $site . ' доступен<br />';
    12.     else
    13.         echo 'Сайт ' . $site . ' не доступен<br />';
    14. }
    Просто модификация твоего кода.


    Ещё можно попробовать через curl_multi_exec
     
  4. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    а я тут писал вчера, отправить нажал а иннет то пропал(( вот и лень стало заново писать сообщение)

    Добавлено спустя 49 секунд:
    a file_get_content?
     
  5. unrecovered

    unrecovered Новичок

    С нами с:
    24 янв 2014
    Сообщения:
    45
    Симпатии:
    0
    Пхп совсем необязательно, рассматриваю варианты. На пыхе легче всего найти было просто =) Курл на очереди, он как раз умеет запросы как браузер генерить, может и получится решить проблему с 301-й.

    Приду домой - попробую обязательно =) Хотя по моим тестам узкое место - это как раз получение тех самых ста символов с сайта($res = fread($check, 100);), остальное выполняется почти мгновенно.

    Добавлено спустя 2 минуты 7 секунд:
    И file_get_content, и get_headers дают примерно одинаковую производительность =\ Причём дело не в толщине канала - там 25 мегабит на входе.

    (оффтоп) почему у вас в сообщении код с подсветкой синтаксиса, а у меня без? О_о
     
  6. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Код (Text):
    1. BB код [code] правится на [code=php]
     
  7. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632