За последние 24 часа нас посетили 18197 программистов и 1596 роботов. Сейчас ищут 969 программистов ...

Мониторинг выполнения длительного процесса

Тема в разделе "Прочие вопросы по PHP", создана пользователем alpinist777, 29 сен 2009.

  1. alpinist777

    alpinist777 Активный пользователь

    С нами с:
    29 сен 2009
    Сообщения:
    17
    Симпатии:
    0
    Функция создаваемой программы такова:
    - скачиваем информацию с нескольких сайтов,
    - анализируем полученную информацию,
    - сохраняем определенные результаты в БД,
    - сравниваем с эталонными значениями,
    - в соответствии с результатами формируем отчет.
    Процесс получается долгий. По приблизительным подсчетам от 40 до 90 минут.
    Браузер столько времени ожидать выполнение программы не хочет.
    Придумал следующий выход:
    Основной PHP-процесс по ходу исполнения сохраняет информацию о себе (сколько процентов выполнено) в файл.
    Вспомогательный скрипт считывает информацию из этого файлика и выдает информационную страницу. Причем, если основной процесс еще не завершил свою работу, в выдаваемой странице вписывать автоматический редирект на саму себя (скажем, с интервалом в 10-15 сек). Ну, а если процесс завершился, будет выдавать результаты (уже без редиректа).

    Кто-нибудь сталкивался с подобными задачами?
    Есть другие методы?
     
  2. kostyl

    kostyl Guest

    для начала ajax
     
  3. alpinist777

    alpinist777 Активный пользователь

    С нами с:
    29 сен 2009
    Сообщения:
    17
    Симпатии:
    0
    С его помощью можно избавиться от редиректа, так?
    Скрипт на "вспомогательной странице" будет обращаться к серверу и мониторить ход выполнения основного процесса.
     
  4. alpinist777

    alpinist777 Активный пользователь

    С нами с:
    29 сен 2009
    Сообщения:
    17
    Симпатии:
    0
    Построение программы продвигалось успешно пока не наткнулся на одну загвоздку, а именно:
    ограничение времени выполнения php-сценария (есть в php.ini такая строчка max_execution_time).

    Попросить у админа увеличить до 1,5 часа - вряд ли поймет :)

    Есть другие способы?!
     
  5. S.t.A.M.

    S.t.A.M. Активный пользователь

    С нами с:
    10 сен 2007
    Сообщения:
    1.041
    Симпатии:
    0
    Разбить на этапы и запускать по крону основной процесс пока все не обработает.
    Точно так же работает рассылка писем в некоторых форумах: запускается скрипт смотрит есть ли письма на отправку - если есть отправляет штук 50, и так до тех пор пока все письма не отправит...
     
  6. alpinist777

    alpinist777 Активный пользователь

    С нами с:
    29 сен 2009
    Сообщения:
    17
    Симпатии:
    0
    Собственно, дописал и отладил. Все работает. Описываю как все сделал, может кому пригодится.
    Реализация "краулера" (или "грабера", кому как нравится) на сервере не удалась. Сервера, на которых находятся сканируемые сайты начинают делать отлуп из-за частых запросов. Некоторые выдают капчу, некоторые откровенно банят IP сервера.
    Перевел все это на свою машину (на Денвере). Сразу исчезли 2 проблемы.
    Во-первых, сторонние сервера начали нормально выдавать страницы сайтов (не смотря на то, что скорость осталась номальной - выделенка 14 Мбит). Ни один ни разу не забанил и не споткнулся, что очень радует.
    Во-вторых, решилась проблема с настройкой php.ini (max_execution_time на своей машине выставляю = сутки), и ничего не надо разбивать на подпроцессы и пр. и пр. - сканируй сколько влезет.
    К тому же обрабатывать полученную информацию на своей машине гораздо удобнее, а для выкладки обработанной информации на свой сайт написал отдельный синхронизатор, который вносит соответствующие изменения в БД на сервере.
    Создавал все это дело для своего каталога товаров, сканировал, соответственно, сайты производителей и поставщиков. Товаров много (>16000), поэтому вручную не реально.
     
  7. iliavlad

    iliavlad Активный пользователь

    С нами с:
    24 янв 2009
    Сообщения:
    1.689
    Симпатии:
    4
    у вас динамический ип-адрес? а то глядишь, скоро вашему провайдеру напишут "что за нах")
     
  8. Carella

    Carella Активный пользователь

    С нами с:
    26 окт 2009
    Сообщения:
    35
    Симпатии:
    0
    Адрес:
    Челябинск
    Да даже и если динамический, данная реализация не есть гут. Диапазон динамическизх адресов все равно принадлежит одному лицу (провайдеру). Поэтому может быть решение типа "тупо бан всей подсети".

    Как вариант предлагаю использовать следующее решение. Создание армии "рабов". У "рабов" единственная функция "скачать страницу и передать тому кто ее запрашивал" (ну в общем по принципу proxy). А далее просто скупаешь за безценок тучу ftp доступов, размещаешь там свой скрипт, записываешь в файлик адреса этих скриптов и забываешь про них насовсем. А дальше все просто. Выбираешь рэндомом "раба", даешь ему адрес чего скачать надо, и получаешь результат. В результате получается: отличный диапазон IP, и отличные рефереры. А если "раб" сдох (админ его прибил например), то просто удаляешь его из своего списка и все (цена то ему копеешная).
     
  9. iliavlad

    iliavlad Активный пользователь

    С нами с:
    24 янв 2009
    Сообщения:
    1.689
    Симпатии:
    4
    видел на одном развлекательном сайте извинения от владельца, что он так забанил пол-Украины.
     
  10. alpinist777

    alpinist777 Активный пользователь

    С нами с:
    29 сен 2009
    Сообщения:
    17
    Симпатии:
    0
    ХЗ почему все прокатывает. Когда краулер работал с сервера - банили стабильно банили через 100-200 запросов. А сейчас уже 2 месяца все работает. Сканер запускается 2 раза в неделю, запросов к каждому сайту поставщиков от 1000 до 18000 (в зависимости от количества товаров).
    Предполагаю, что даже при высокой скорости домашнего интернета запросы с сервера шли значительно быстрее и сторонние сервера воспринимали это как угрозу атаки.
    А может быть, дело в обработке сервером опций исходящего запроса, сформированного функцией curl_exec(). Домашний Апач все пропускает без изменений (там выставляются таймаут и имя браузера, от которого якобы делается запрос страницы), а сервер заменяет чем-нить своим.
    У меня относительно провайдера IP-адрес статический. А вот дальше? Если 1000 моих запросов к стороннему серверу от моего провайдера уходят с различными IP-адресами, то тоже все объяснимо (почему не банят).