PHP и запланированные задачи
-
06-07-2019 - |
Вопрос
Я пытаюсь составить список различных подходов к запуску запланированных задач на PHP.Мое намерение — предоставить универсальный способ запуска запланированных задач на PHP.На данный момент у меня есть:
1) Анализируйте посещаемость сайта.Если вы получаете 770 обращений в день (то есть одно обращение каждые 2 минуты), вы запланировали запуск задачи на 6:00 утра, а посетитель запросил страницу в 5:59 утра, то запустите задачу, потому что следующий посетитель прибывают в среднем в 6:01 утра.В этом случае Run = exec('/usr/bin/php -f /home/account/cron.php').
(+) Работает на всех платформах, если пути указаны правильно.
(-) Требует некоторой мощности процессора.
(-) Требуется exec().
(-) Неточно на небольших сайтах или на сайтах с огромными скачками трафика.
2) Улучшенная версия вышеописанного.Когда пользователь запрашивает страницу и задача должна быть запущена, не используйте exec(), а используйте include() после того, как вы передали содержимое пользователю.
(+) Работает на всех платформах.
(+) Нет exec().
(-) Требует некоторой мощности процессора.
(-) Неточно на небольших сайтах или на сайтах с огромными скачками трафика.
3) Запуск отдельного фонового процесса, чтобы он работал в постоянном цикле.Предоставьте интерфейс администратора, который позволит вам «запускать» и «завершать» «службу».Затем он будет использовать fsockopen() для вызова скрипта .php, который работает бесконечно.Он использует функцию сна(), чтобы не потреблять ресурсы и проснуться в подходящее время (см.:time_sleep_until()).Он мог искать файлы и читать их, чтобы понять, когда и какие задачи запускать.Можно создать файл «run-everyday-3.00am», который заставит планировщик запускать код внутри него.
(+) Работает на всех платформах.
(+) Нет exec().
(+) Может быть весьма точным (например.если он спит поминутно).
(-) Нестабилен - сбой сервера полностью останавливает планировщик.
(-) Некоторым хостам не нравится, когда процесс работает 24/7/365 = потребляет ресурсы?
4) Запустите exec('crontab') непосредственно в Linux и других подобных системах.
(+) Это не пожиратель ресурсов.
(+) Точно.
(-) исполнитель().
(-) Работает не на всех платформах.
5) Запрос учетных данных cPanel и выполнение POST для создания, управления и удаления cron.
(+) Точно
(+) Это не пожиратель ресурсов.
(-) Плохо для безопасности
(-) Требуются данные пользователя = снижается удобство использования.
(-) Работает не на всех платформах (требуется cPanel, который не работает в Windows).
(-) Требуется cPanel.
Есть еще идеи?
Решение
Почти все предложенные вами методы ужасны, хотя большинство из них будут работать. Р>
Моя уродливая альтернатива - настроить cron на локальном компьютере с подключением к Интернету, который запускает команду curl каждые несколько минут. Р>
Это так же безобразно, как и все ваши решения, но немного более надежно. Р>
Другие советы
Я использую инструмент Windows под названием VisualCron для проверки связи сценариев, защищенных http-паролем, на удаленных серверах, которые затем выполняют определенные задачи.VC также имеет встроенные уведомления о статусе по электронной почте.
Обратите внимание, что это очень похоже на сообщение Зака об использовании локального cron+curl или cron+wget.
http://www.visualcron.com http://www.visualcron.com/img/screenshots/v5/mainwindow/mainwindow_bluetheme.png
Вы когда-либо использовали планировщик задач Windows или в команде ? Его можно использовать в качестве альтернативы CRON в UNIX. Вы можете (1) написать сценарий PHP, который выполняет все необходимые обязанности (2) настроить задание CRON в UNIX или запланированное задание в Windows для выполнения этого сценария через PHP CLI. Р>
Также возможно выполнить сценарий, открыв его с HTTP с удаленного компьютера. Удаленная машина может быть UNIX или Windows. wget можно использовать вместо веб-браузера, и он доступен для обеих платформ. р>
Я бы выбрал второй сервер / виртуальную машину для выполнения запланированных задач такого типа. Этот второй сервер может быть удаленным и выполнять другие функции, такие как уведомление вас о том, что ваш основной сервер не отвечает, и т. Д.
Кстати, какое у вас определение "точного"?
ИМХО, вы должны написать слой над этими методами ...
User code <=> [User interface]<-> Your library <->[Technology interface] <=> Technology execution module (method)
Тогда вам не нужно реализовывать все методы, но если вам или вашему клиенту нужен новый метод ... все, что ему нужно сделать, - это реализовать ваш технологический интерфейс.
Кстати, «метод выполнения технологии» может быть написан как модуль PHP для лучшей производительности / интеграции с хост-системой.
На вашем месте я бы искал существующую библиотеку / модуль и не создавал бы фоновый процесс, если бы базовая система не могла обрабатывать запланированные задачи (Unix и Windows действительно их обрабатывали).