Проблема
У меня есть форма, которая при отправке запускает базовый код для обработки отправленной информации и вставки ее в базу данных для отображения на веб-сайте уведомлений. Кроме того, у меня есть список людей, которые подписались на получение этих уведомлений по электронной почте и SMS. На данный момент этот список тривиален (всего около 150), однако его достаточно, чтобы циклически перебрать всю таблицу подписчиков и отправить более 150 электронных писем. (Электронные письма отправляются индивидуально по запросу системных администраторов нашего почтового сервера из-за политики массовой рассылки.)
В это время человек, разместивший уведомление, будет сидеть на последней странице формы почти минуту без какого-либо положительного подтверждения того, что его уведомление публикуется. Это приводит к другим потенциальным проблемам, все из которых имеют возможные решения, которые я считаю не идеальными.
Во-первых, автор может подумать, что сервер отстает, и снова нажать кнопку «Отправить», в результате чего скрипт запустится заново или будет запущен дважды. Я мог бы решить эту проблему, используя JavaScript, чтобы отключить кнопку и заменить текст, чтобы сказать что-то вроде «Обработка ...», однако это далеко не идеально, потому что пользователь все равно будет застрять на странице на время выполнения скрипта. (Кроме того, если JavaScript отключен, эта проблема все еще существует.)
Во-вторых, автор может преждевременно закрыть вкладку или браузер после отправки формы. Сценарий будет продолжать работать на сервере до тех пор, пока он не попытается выполнить обратную запись в браузер, однако, если пользователь затем перейдет на любую страницу в нашем домене (пока скрипт все еще запущен), браузер зависнет при загрузке страницы, пока скрипт не завершится. . (Это происходит только тогда, когда закрывается вкладка или окно браузера, а не все приложение браузера.) Тем не менее, это далеко не идеально.
(Возможное) Решение.
Я решил, что хочу выделить часть сценария «электронная почта» в отдельный файл, который я могу вызвать после публикации уведомления. Первоначально я думал разместить это на странице подтверждения после того, как уведомление было успешно отправлено. Однако пользователь не узнает, что этот сценарий запущен, и ему не будут очевидны какие-либо аномалии; Этот сценарий не может потерпеть неудачу.
Но что, если я могу запустить этот сценарий в фоновом режиме? Итак, мой вопрос таков: как я могу выполнить скрипт PHP для запуска в качестве фоновой службы и полностью независимо от того, что пользователь сделал на уровне формы?
РЕДАКТИРОВАТЬ: это нельзя cron'ed. Он должен запускаться в момент отправки формы. Это уведомления с высоким приоритетом. Кроме того, системные администраторы, работающие на наших серверах, запрещают запускать crons чаще, чем 5 минут.
exec()
но я никогда этого не пробовал.
ajax
и вставляю sleep()
с интервалом времени внутри цикла (в моем случае я использую foreach) для запуска фонового процесса. Он отлично работает на моем сервере. Не уверен насчет других. Я также добавляю ignore_user_abort()
и set_time_limit()
(с расчетным временем окончания) перед циклом, чтобы убедиться, что скрипт не будет остановлен сервером, который я использую, даже в соответствии с моим тестом, скрипт завершает задачу без ignore_user_abort()
и set_time_limit()
.
gearman
php для решения фоновых задач. Он идеально подходит для масштабирования, если вы столкнулись с большой обработкой и большими нагрузками. Вам стоит взглянуть на это.