Короткий ответ, нет, не переходите в фоновый процесс, если это будет решение, размещенное на клиенте. Если вы идете к концепции ASP (поставщик службы приложений ... не страницы активных серверов;)), то вы можете сделать некоторые дурацкие вещи с фоновыми процессами и внешними приложениями, подключающимися к вашим серверам sql и обрабатывающими для вас.
Я предлагаю создать надежную магистраль управления задачами и связать ее с надежной инфраструктурой обработки задач. Я рекомендую вам прочитать старый пост, который я написал довольно давно относительно фоновых процессов и стратегии, которую я принял для исправления длительных процессов:
Запуск и остановка PHP-скрипта с административной веб-страницы Backend
Приятного чтения ...
UPDATE
Я понимаю, что мой старый пост далеко не легок для понимания, поэтому вот так:
Вам нужны 2 модели: Job и JobQueue, 2 контроллера: JobProcessor, XYZProcessor
JobProcessor вызывается пользователем, когда запускается страница, или использует cronjob по вашему желанию. JobProcessor :: process () - это ключ, который запускает всю обработку или продолжает ее. Он загружает JobQueues и спрашивает очереди заданий, есть ли работа, которую нужно сделать. Если есть работа, которую нужно выполнить, он просит очередь заданий начать / продолжить свою работу.
Модель JobQueue: используется для постановки в очередь нескольких JOBS, расположенных один за другим, и контролирует, какое задание является текущим, сохраняя некоторый идентификатор и STATE о том, какое задание выполняется.
Модель задания: представляет собой именно то, что нужно сделать, например, содержит имя контроллера, который будет обрабатывать данные, функцию, которую нужно вызвать для обработки данных, и свойство сериализованной конфигурации, которое описывает, что должно быть сделано.
XYZController: тот, который содержит метод обработки. Когда вызывается метод обработки, контроллер должен загрузить все, что ему нужно, в память, а затем обработать каждую отдельную единицу работы как можно быстрее.
Пример:
- Вызов index.php
- Index.php создает контроллер обработчика заданий
- Index.php вызывает процесс задания ()
- JobProcessor :: Process () загружает все очереди и обрабатывает их
- Для каждого JobQueue :: Process () очередь заданий загружает возможные рабочие места и определяет, запущена она в данный момент или нет. Если ни один из них не запущен, он запускает следующий, вызывая Job :: Process ();
- Job :: Process () создает XYZController, который будет выполнять задачу под рукой. Например, в моей старой системе были InvoicingController и MassmailingController, которые работали рука об руку.
- Job :: Process () вызывает XYZController :: Prepare (), чтобы загрузить информацию для обработки. (Например, загрузить пакет электронных писем для обработки, загрузить пакет счетов для создания)
- Job :: Process () вызывает XYZController :: RunWorkUnit (), чтобы обрабатывать одну единицу работы (например, создать один счет-фактуру, отправить одно электронное письмо)
- Job :: Process () запрашивает JobProcessingController :: DoIStillHaveTimeToProcess () и, если это так, продолжает обработку следующего элемента.
- Job :: Process () не хватает времени и вызывает XYZController :: Cleanup (), чтобы освободить все ресурсы
- JobQueue :: Process () заканчивается и возвращается в JobController
- JobController :: Process () скоро закончится? Откройте сокет, перезвоните мне, чтобы я мог начать новый раунд обработки, пока у меня больше не будет ничего делать
- Обработка запроса от пользователя, который стартует в позиции № 1.
В конечном итоге вы можете вместо этого каждый раз открывать сокет и просить процессор что-то сделать, или вы можете поставить CronJob в очередь для вызова вашего процессора. Таким образом, ваши пользователи не будут застревать в ожидании завершения 3/4 рабочих блоков каждый раз.