Запланированные задачи (cronjob-альтернатива) с Zend Framework? - PullRequest
0 голосов
/ 22 ноября 2010

У меня есть веб-приложение, написанное на PHP (Zend Framework), и я хотел бы выполнять (несколько) сценариев время от времени. Например, один раз в день. Я знаю, что это можно сделать с помощью crontab и cronjobs, но не на всех хостинг-провайдерах они есть. Поэтому я ищу решение без использования Cronjob.

Как вы решаете это? Каковы возможности?

Ответы [ 5 ]

4 голосов
/ 22 ноября 2010

Задания Cron действительно предлагают только несколько основных преимуществ: планирование, выполнение и ведение журнала. Это все вещи, которые довольно легко воспроизвести в приложении PHP ...

Шаг первый: создание таблицы задач

Вам нужно хранить:

  1. Частота исполнения
  2. Что выполнить (включая файл, обратный вызов, eval-код и т. Д.)
  3. Рассчитать дату следующего запуска
  4. Сохранить предыдущие даты выполнения

Шаг второй: выполнение

У вас есть несколько вариантов того, как на самом деле запускать задачи:

  1. Вызывать сгенерированное PHP пустое GIF-изображение при каждом запуске страницы, которое вызывает код cron.
  2. Вызов скрипта AJAX, который запускает код cron
  3. Обычно вызывайте его внутри приложения (может замедлить выполнение)

Независимо от того, как он запускается, он запускает реальный код cron, который решает, есть ли какие-либо задачи для запуска и какие из них запускать.

Шаг третий: регистрация

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

...

Перед запуском задачи вы должны обновить предыдущую дату выполнения, а после запуска задачи вы должны установить следующую дату запуска, основываясь на ее частоте. Единственный недостаток этого метода заключается в том, что когда никто не посещает сайты, никакие задания cron не будут выполняться до следующего посетителя.

4 голосов
/ 22 ноября 2010

Вы можете использовать такой сервис:

CronLess

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

1 голос
/ 23 ноября 2010

Проверьте эти ссылки. В настоящее время я использую модифицированный начальный загрузчик (на основе этих статей) для нескольких проектов ZF, и запуск приложения из командной строки очень прост.

http://blog.astrumfutura.com/2009/09/the-mysteries-of-asynchronous-processing-with-php-part-1-asynchronous-benefits-task-identification-and-implementation-methods/

http://blog.astrumfutura.com/2009/09/the-mysteries-of-asynchronous-processing-with-php-part-2-making-zend-framework-applications-cli-accessible/

http://blog.astrumfutura.com/2009/10/the-mysteries-of-asynchronous-processing-with-php-part-3-implementation-with-spawned-child-processes-using-simple-scripts-or-zend-framework/

0 голосов
/ 06 марта 2013

Я согласен с ответом Арне, однако, если вы уже используете Zend Framework, вы должны реализовать свое решение, используя встроенное Zend_Queue, которое фактически сделано для этого. Чтобы увидеть, как это реализовать, здесь есть ссылка на другой вопрос, который описывает, как настроить вашу инфраструктуру. Инфраструктура для работы с Zend Queue Receiver

0 голосов
/ 22 ноября 2010

Я сделал нечто подобное @Adrian Schneider.Если вы хотите добавить больше согласованности в свое приложение, вы можете добавить интерфейс Cronable, который заставляет классы, которые его реализуют, добавить функцию cron (), которая будет обрабатывать внутреннюю логику cron, которая иногда отличается.Все это можно обернуть и вызвать аналогичным образом с помощью оболочки cron, который будет единственным скриптом, вызываемым cron в системе, который будет определять, какие текущие задания PHP cron должны выполняться.Вы можете получить более подробную информацию в моем ответе от здесь .

...