Вопрос

Я пытаюсь составить список различных подходов к запуску запланированных задач на 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 действительно их обрабатывали).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top