PHP и запланированные задачи - PullRequest
3 голосов
/ 28 ноября 2009

Я пытаюсь составить список различных подходов для выполнения запланированных задач на PHP. Я намерен предоставить универсальный способ запуска запланированных задач в PHP. Пока что у меня есть:

1) Анализ трафика сайта. Если вы получаете 770 обращений в день (то есть одно попадание в 2 минуты), и вы запланировали выполнение задачи на 6:00, а посетитель запросил страницу на 5:59, то запустите задачу, потому что следующий посетитель будет прибыть в 6:01 утра в среднем. Запустите = 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 = ресурс боров?

4) Запустите exec ('crontab') напрямую в Linux и т. П.

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

(+) Точно.

(-) exec ().

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

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

(+) Точно

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

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

(-) Требуются данные пользователя = снижение удобства использования

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

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

Есть еще идеи?

Ответы [ 5 ]

4 голосов
/ 08 декабря 2009

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

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

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

2 голосов
/ 10 декабря 2009

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

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

http://www.visualcron.com http://www.visualcron.com/img/screenshots/v5/mainwindow/mainwindow_bluetheme.png

1 голос
/ 09 декабря 2009

Вы когда-нибудь использовали планировщик задач Windows или в команде ? Его можно использовать в качестве альтернативы CRON в UNIX. Вы можете (1) написать скрипт PHP, который выполняет все необходимые обязанности (2) настроить задачу CRON в UNIX или запланированную задачу в Windows, чтобы выполнить этот скрипт через PHP CLI.

Также возможно выполнить скрипт, открыв его с HTTP с удаленного компьютера. Удаленная машина может быть UNIX или Windows. wget может использоваться вместо веб-браузера и доступно для обеих платформ.

0 голосов
/ 08 декабря 2009

ИМХО, вы должны написать слой над этими методами ...

User code <=> [User interface]<-> Your library <->[Technology interface] <=> Technology execution module (method)

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

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

На вашем месте я бы искал существующую библиотеку / модуль и не создал бы фоновый процесс, если бы базовая система не могла обрабатывать запланированные задачи (Unix и Windows действительно их обрабатывали).

0 голосов
/ 03 декабря 2009

Я бы выбрал второй сервер / виртуальную машину для запуска этих типов запланированных задач. Этот второй сервер может быть удаленным и выполнять другие функции, такие как уведомление вас о том, что ваш основной сервер не отвечает, и т. Д.

Кстати, какое у вас определение "точный?"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...