Как реализовать менеджер выполнения скриптов в php на удаленном сервере - PullRequest
1 голос
/ 15 февраля 2012

Я пытаюсь создать сервис, который будет собирать данные из сети через определенные промежутки времени, а затем анализировать эти данные, наконец, в результате анализа - выполнять специальные процедуры.Типичная схема запуска службы:

  1. Запросить обновление списка элементов до
  2. Загрузить данные перечисленных элементов
  3. Проверить, что еще не обновлено
  4. Обновление базы данных
  5. Фильтровать данные, содержащие обновления (получать только обновления с наивысшим приоритетом)
  6. Выполнить некоторые процедуры для анализа обновлений
  7. Фильтровать данные, содержащие обновления (получать только обновления со средним приоритетом)
  8. Выполните некоторые процедуры для разбора ... ... ...

Все было бы просто, если бы не так много данных для обновления.Необходимо обновить так много данных, что на каждом шаге от 1 до 8 (может быть, кроме 1) сценарии не будут работать из-за ограничения максимального времени выполнения 60 секунд.Даже если бы была возможность увеличить его, это было бы неоптимально, так как основная цель проекта - доставить данные с наивысшим приоритетом в первую очередь.Неудачное определение уровня приоритета информации основано на получении большинства всех данных и выполнении большого количества сравнений между уже сохраненными данными и входящими (обновляющими) данными.

Я мог бы отказаться от скорости обслуживания, чтобы получить хотя бы высокий приоритетобновления в обмен и ждите больше времени для всех остальных.Я думал о том, чтобы написать какой-нибудь родительский скрипт (менеджер), чтобы контролировать каждый шаг (1-8) службы, возможно, выполняя другие скрипты?Менеджер должен иметь возможность возобновить незаконченный шаг (сценарий), чтобы завершить его.Каждый шаг можно написать таким образом, чтобы он выполнял небольшую часть кода и после его завершения помечал эту небольшую часть работы как выполненную, например, в базе данных SQL.после возобновления работы менеджера step (script) будет продолжаться с момента, когда он был прерван сервером из-за превышения max exec.time.

Известные ограничения платформы: удаленный сервер, неизменяемое максимальное время выполнения, обычно ограничение на анализ одного сценария одновременно, отсутствие доступа ко многим функциям apache и все другие ограничения, характерные для удаленных серверов

Требования: какой-то тип менеджера является обязательным, поскольку помимо вызова определенных сценариев этот родительский процесс должен написать некоторые заметки о сценариях, которые активированы программным обеспечением.

Менеджер может быть вызван с помощью crul, достаточно одного минутного интервала.К сожалению, создание списка вызовов для каждого шага обслуживания здесь не вариант.

Я также рассматривал возможность получения нового удаленного хоста для каждого шага обслуживания и управления им с помощью другого удаленного хоста, который мог бы их вызывать, ипопросить выполнить свою работу, используя, например, SOAP, но этот сценарий находится в конце моего списка желаемых решений, потому что он не решает проблему максимального времени выполнения и обеспечивает большой объем обмена данными по глобальной сети, ведь это самый медленный способ работы с данными..

Есть мысли о том, как реализовать решение?

1 Ответ

0 голосов
/ 15 февраля 2012

Я не вижу, как шаги 2 и 3 сами по себе могут выполняться более 60 секунд.Если вы используете curl_multi_exec для шага 2, он будет запущен в считанные секунды.Если вы получите свой сценарий более чем на 60 секунд на шаге 3, вы получите вместо этого «ограничение памяти» и намного раньше.

Все это приводит меня к выводу, что сценарий очень неоптимизировано.И решение будет таким:

  1. разбить задачу на (а) что обновить и сохранить это в базе данных (скажем, флаг 1 для того, что обновлять, 0 для чего не делать);(б) циклически перебирать строки, которые нужно обновить, и обновлять их, устанавливая флаг в 0. Через ~ 50 секунд просто выключите (при условии, что скрипт запускается каждые несколько минут, это будет работать).

  2. получите второй сервер и установите для него правильное время выполнения, чтобы ваш скрипт мог работать часами.Поскольку он будет иметь доступ к вашей первой базе данных (а не через HTTP-вызовы), это не приведет к значительному увеличению трафика.

...