Коммерческий PHP скрипт, долго работающие процессы.демоны против cronjobs? - PullRequest
3 голосов
/ 25 января 2012

Я собираю свое первое коммерческое PHP-приложение, оно ничего особенного, поскольку я все еще с нетерпением жду PHP:)

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

Теперь я думаю, что у меня есть два варианта: либо использовать cronjobs, например, разрешить запуск одного или нескольких cronjobs за один раз, который может установить каждый клиент, или ИЛИ выполнить всю обработку данных как демонов, которые работают в фоновом режиме ...

У меня такой вопрос, так как это самостоятельное приложение (и каждый сервер отличается) ... даже рекомендуется попробовать написать php, который запускает фоновые процессы на клиентском сервере, или это нечто большее?что вы можете сделать надежно только на вашем собственном сервере ...?

Или я должен использовать CRonjobs для этих длительных процессов?

(в зависимости от количества данных, которые мои клиенты будут вводить в приложение, процесс может выполняться более 3 часов)

Это даже проблема, которая может бытьнадежно решено с помощью PHP ...?Извините, если это странный вопрос, у меня действительно нет опыта работы с PHP-демонами и / или долго выполняющимися cronjobs, созданными php.

Итак, резюмируем все: коммерческое само размещаемое приложение, включая долго выполняющиеся процессы, cronjobs или демоны?И является ли или может быть и то и другое надежным решением для платного приложения, которое вы можете дать своим клиентам с чистой совестью, потому что вы знаете, что оно будет надежно работать на всех видах различных серверов ...?

EDIT * PS: Извините, я забыл упомянуть, что приложение предназначено только для серверов Linux, поэтому все, как Debian, Ubuntu и т. Д. И т. Д.

Ответы [ 2 ]

4 голосов
/ 25 января 2012

Короткий ответ, нет, не переходите в фоновый процесс, если это будет решение, размещенное на клиенте. Если вы идете к концепции ASP (поставщик службы приложений ... не страницы активных серверов;)), то вы можете сделать некоторые дурацкие вещи с фоновыми процессами и внешними приложениями, подключающимися к вашим серверам sql и обрабатывающими для вас.

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

Запуск и остановка PHP-скрипта с административной веб-страницы Backend

Приятного чтения ...

UPDATE

Я понимаю, что мой старый пост далеко не легок для понимания, поэтому вот так:

Вам нужны 2 модели: Job и JobQueue, 2 контроллера: JobProcessor, XYZProcessor

JobProcessor вызывается пользователем, когда запускается страница, или использует cronjob по вашему желанию. JobProcessor :: process () - это ключ, который запускает всю обработку или продолжает ее. Он загружает JobQueues и спрашивает очереди заданий, есть ли работа, которую нужно сделать. Если есть работа, которую нужно выполнить, он просит очередь заданий начать / продолжить свою работу.

Модель JobQueue: используется для постановки в очередь нескольких JOBS, расположенных один за другим, и контролирует, какое задание является текущим, сохраняя некоторый идентификатор и STATE о том, какое задание выполняется.

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

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

Пример:

  1. Вызов index.php
  2. Index.php создает контроллер обработчика заданий
  3. Index.php вызывает процесс задания ()
  4. JobProcessor :: Process () загружает все очереди и обрабатывает их
  5. Для каждого JobQueue :: Process () очередь заданий загружает возможные рабочие места и определяет, запущена она в данный момент или нет. Если ни один из них не запущен, он запускает следующий, вызывая Job :: Process ();
  6. Job :: Process () создает XYZController, который будет выполнять задачу под рукой. Например, в моей старой системе были InvoicingController и MassmailingController, которые работали рука об руку.
  7. Job :: Process () вызывает XYZController :: Prepare (), чтобы загрузить информацию для обработки. (Например, загрузить пакет электронных писем для обработки, загрузить пакет счетов для создания)
  8. Job :: Process () вызывает XYZController :: RunWorkUnit (), чтобы обрабатывать одну единицу работы (например, создать один счет-фактуру, отправить одно электронное письмо)
  9. Job :: Process () запрашивает JobProcessingController :: DoIStillHaveTimeToProcess () и, если это так, продолжает обработку следующего элемента.
  10. Job :: Process () не хватает времени и вызывает XYZController :: Cleanup (), чтобы освободить все ресурсы
  11. JobQueue :: Process () заканчивается и возвращается в JobController
  12. JobController :: Process () скоро закончится? Откройте сокет, перезвоните мне, чтобы я мог начать новый раунд обработки, пока у меня больше не будет ничего делать
  13. Обработка запроса от пользователя, который стартует в позиции № 1.

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

2 голосов
/ 25 января 2012

Стоит отметить, что, помимо запуска заданий демонов или cron, вы можете запускать длительно выполняющиеся процессы из веб-запроса (но учтите, что он должен выполняться вне группы процессов веб-сервера) и изкурс асинхронная обработка сообщений (что по сути является вариантом пакетного подхода).

Все четыре из этих подходов очень разные с точки зрения их поведения, управления параллелизмом и временем.Факторы, которые отличают их от других, те же, что вы пропустили в своем вопросе, поэтому ответить на них невозможно.Если вы хотите продать свое приложение на обеих платформах, ему понадобятся две версии.

Может быть, вам стоит поговорить с потенциальной клиентской базой и спросить, чего они хотят?

...