Выполнение асинхронной работы обычно является нарушением рабочего процесса, если вы привыкли создавать «нормальные» веб-страницы, потому что любая асинхронная деятельность находится за пределами обычного жизненного цикла запроса.
Вам необходимо делегировать асинхронную задачу выделенной программе., процесс или поток.Это подразумевает использование своего рода системы очередей и наличие отдельного процесса, задачей которого является запуск задач в системе очередей и обновление статуса.
Если вы находитесь на пути к обучению, я бы посоветовал вамразверните свое собственное - минимальная система очередей - хороший учебный проект;Вы можете развернуть его, используя обычную систему управления базами данных.Вам нужно следить за условиями гонки (подсказка: используйте блокировки строк).
Если вы на пути к производству, я бы порекомендовал использовать что-то вроде ZeroMQ для этого - я понимаю, что есть хорошиеbindings for PHP.
Помимо обновления вашего веб-сайта и чтения из системы очередей, вам понадобится исполнитель задач - самая простая форма которого - запланированное задание;Вы могли бы сделать простой php-скрипт, работающий в цикле while
, который некоторое время спит (в зависимости от трафика создаваемого вами программного обеспечения), проверяет, есть ли что-то в очереди заданий и выполняет обновления при необходимости.
Вероятно, вам нужно будет научиться запускать процесс каждый раз при загрузке компьютера, чтобы сделать это, в противном случае простая перезагрузка системы может помешать вашей настройке.
В конце концов,рабочий процесс будет выглядеть примерно так:
- На веб-сайте есть средство для проверки очереди (я ставил в очередь то, что еще не было завершено? Есть ли то, что я поставил в очередь, уже завершено?пользователь знает, что задание было выполнено? и т. д.)
- Веб-сайт имеет возможность вставлять задания в очередь
- Процесс , отдельный от веб-сайта , может проверятьвремя от времени, и обновляет его с результатом транзакций