PHP и запланированные задачи

Я пытаюсь придумать список различных подходов для запуска запланированных задач на 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, который выполняется бесконечно. Он использует sleep (), чтобы не потреблять ресурсы и просыпаться, когда время подходит (см .: time_sleep_until ()). Он мог искать файлы и читать их, чтобы понять, когда выполнять какие задачи. Можно создать файл «run-daily-3.00am», который заставляет планировщик запускать код внутри него.

(+) Работает на всех платформах.

(+) Нет exec ().

(+) Может быть довольно точным (например, если он спит в минуту).

(-) Нестабилен – серверный сбой полностью останавливает планировщик.

(-) Некоторые хосты не хотят, чтобы процесс работал 24/7/365 = ресурс hog?

4) Запустите exec ('crontab') непосредственно на Linux и аналогично.

(+) Это не ресурс.

(+) Точный.

(-) exec ().

(-) Не работает на всех платформах.

5) Просить учетные данные cPanel и сделать POST для создания / управления / удаления клонов.

(+) Точный

(+) Это не ресурс.

(-) Плохо для безопасности

(-) Требуется пользовательская информация = уменьшенное удобство использования

(-) Не работает на всех платформах (требуется cPanel, который не работает в Windows).

(-) Требуется cPanel.

Любые другие идеи?

Related of "PHP и запланированные задачи"

Почти все методы, которые вы предложили, являются уродливыми, хотя большинство из них будут работать.

Моя уродливая альтернатива заключается в том, чтобы настроить cron на локальной машине с подключением к Интернету, которая запускает команду curl за несколько минут.

Это так же безобразно, как и все ваши решения, но немного более надежным.

Я использую средство Windows под названием VisualCron для проверки подлинности http-пароля, защищенных паролем, на удаленных серверах, которые затем выполняют конкретные задачи. У VC также есть хорошие уведомления о статусе электронной почты.

Обратите внимание, что это очень похоже на сообщение Зака ​​об использовании локальных cron + curl или cron + wget

http://www.visualcron.com http://img.ruphp.com/php/mainwindow_bluetheme.png

Вы когда-нибудь использовали планировщик задач Windows или команду at ? Его можно использовать в качестве альтернативы 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) 

Тогда вам не нужно реализовывать все методы, но если вам или вашему клиенту нужен новый метод … все, что он должен сделать, это реализовать свой технологический интерфейс.

BTW, «метод выполнения технологий» может быть написан как PHP-модуль для лучшей интеграции производительности / хост-системы.

Если бы я был вами, я бы искал существующую библиотеку / модуль, и я бы не создал фоновый процесс, если базовая система не сможет обрабатывать запланированные задачи (unix и windows справляются с ними).