Проблема У
мене є форма, яка при надходженні запустить базовий код для обробки поданої інформації та вставки її в базу даних для відображення на веб-сайті сповіщень. Крім того, у мене є список людей, які підписалися на отримання цих сповіщень електронною поштою та SMS-повідомленнями. Цей список є тривіальним як момент (всього лише близько 150), однак для того, щоб пройти цикл по всій таблиці передплатників і відправити 150+ електронних листів, достатньо, щоб зайняти хвилину вгору. (Електронні листи надсилаються індивідуально, як цього вимагають системні адміністратори нашого сервера електронної пошти через масову політику електронної пошти.)
Протягом цього часу особа, яка опублікувала попередження, майже хвилину сидітиме на останній сторінці форми без жодного позитивного підкріплення того, що їх повідомлення розміщується. Це призводить до інших потенційних проблем, все, що є можливими рішеннями, які я вважаю, є менш ідеальними.
По-перше, плакат може подумати, що сервер відстає і знову натиснути кнопку "Надіслати", в результаті чого сценарій запускається або запускається двічі. Я міг би вирішити це за допомогою JavaScript для відключення кнопки та заміни тексту, щоб сказати щось на кшталт "Обробка ...", однак це менш ніж ідеально, оскільки користувач все ще буде застряг на сторінці протягом тривалості виконання сценарію. (Крім того, якщо JavaScript відключений, ця проблема все ще існує.)
По-друге, плакат може закрити вкладку чи браузер передчасно після надсилання форми. Сценарій буде працювати на сервері до тих пір, поки він не спробує записати його назад у браузер, однак якщо користувач перегляне будь-яку сторінку в нашому домені (поки сценарій все ще працює), браузер зависне завантажувати сторінку, поки сценарій не закінчиться . (Це відбувається лише тоді, коли вкладка чи вікно веб-переглядача закриті, а не вся програма браузера.) Все ж це менш ніж ідеально.
(Можливо) Рішення.
Я вирішив, що хочу вивести частину сценарію "електронною поштою" в окремий файл, до якого я можу зателефонувати після публікації повідомлення. Спочатку я думав розмістити це на сторінці підтвердження після успішного розміщення повідомлення. Однак користувач не знатиме, що цей сценарій працює, і будь-які аномалії їм не будуть помітні; Цей сценарій не може вийти з ладу.
Але що робити, якщо я можу запустити цей скрипт як фоновий процес? Отже, моє запитання таке: Як я можу виконати скрипт PHP для запуску як фонової послуги та запустити повністю незалежно від того, що зробив користувач на рівні форми?
РЕДАКТУВАТИ : Цього не можна поширити. Він повинен запускатися з моменту подання форми. Це сповіщення з високим пріоритетом. Крім того, системні адміністратори, що працюють на наших серверах, забороняють кронам працювати більше 5 хвилин.
exec()
але я ніколи цього не пробував.
ajax
та вставляю sleep()
з тимчасовим інтервалом всередині циклу (я використовую foreach у моєму випадку) для запуску фонового процесу. Він прекрасно працює на моєму сервері. Не впевнений у інших. Я також додаю ignore_user_abort()
і set_time_limit()
(з розрахунковим кінцевим часом) перед циклом, щоб переконатися, що скрипт не буде зупинений сервером, яким я користуюся, навіть згідно мого тесту, сценарій, що виконує завдання без ignore_user_abort()
і set_time_limit()
.
gearman
php для вирішення фонових завдань. Це ідеально підходить для масштабування, якщо ви стикалися з великою обробкою часу та великими навантаженнями. Ви повинні поглянути на це.