Как работать с заданием cron в zendframework 2?

У меня есть две функции в Zend Framework 2, которые извлекают мне информацию о квартирах с другого сайта и сохраняют их в моей базе данных. (НО ОНИ ДЕЛАЮТ ТАК ТОЛЬКО КОГДА Я ЗАПУСКАЮ ФУНКЦИИ).

скажем, имя контроллера — «FetchFromSourceController», а функции — «index» и «ical». это имена, которые я использовал.

Но мое требование состоит в том, что эти две функции должны запускаться автоматически одна за другой в начале дня с промежутком в 10 минут. т. е. действие index должно запускаться в 00:00, а действие ical должно запускаться в 00:10 каждый день.

Я слышал, что для этой цели можно использовать «задание cron», но никогда раньше этим не пользовался. Пожалуйста, скажите мне, где написать код задания cron в ZF2 для запуска этих функций в это конкретное время.

или, по крайней мере, дайте мне какое-нибудь руководство по использованию задания cron в zendframework2. Я искал его, но не нашел. Заранее спасибо.


person raghuveer999    schedule 04.11.2013    source источник


Ответы (3)


В ZF2 нет службы "cron job" для автоматического запуска сценариев в определенное время.

Задание Cron — это задача, выполняемая в определенное время и обычно настраиваемая на уровне операционной системы. В unix это делается через crontab, в windows можно использовать планировщик задач. В ZF2 нет ничего, что запускало бы ваши скрипты ровно в 12:00 и 12:10.

Вариант 1. Задание Cron через панель администратора

Для большинства сред хостинга вы можете настроить «задание cron» через панель администратора вашего веб-сайта (например, Plesk или cPanel). Там вы сможете запланировать задание, введя время и команду для запуска. Когда вы создаете задание cron таким образом, имейте в виду, что вы будете вводить команду, которая будет выполняться через командную строку. Обычно это прямой вызов php для выполнения определенного скрипта, но вы также можете использовать wget для получения любой URL из Интернета. Если вы напрямую вызываете php, вам нужно настроить маршрут консоли в соответствии с ответом Зденека.

/usr/bin/php /path/to/zf2/public/index.php myIndexConsoleRoute

or

wget http://yoursite.com/fetch-from-source/index

Вариант 2. Настройка Crontab через командную строку

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

Вариант № 3. Служба задач Cron. Если вы ищете более простое решение, вы можете рассмотреть одну из служб cron, которая будет загружать определенный URL-адрес в заданное время.

Например, я использовал этот сервис в прошлом: https://www.setcronjob.com

После создания учетной записи вы просто вводите URL-адрес и выбираете время, когда вы хотите, чтобы URL-адрес вызывался. Вы можете легко выполнить свои требования по вызову indexAction в 12:00 и icalAction в 12:10, настроив два задания: одно для запуска в 12:00, а другое для запуска в 12:10. У SetCronjob есть бесплатный план, который может соответствовать вашим потребностям, но имейте в виду, что они требуют, чтобы вы вводили капчу каждые 30 дней, чтобы продлить свою бесплатную учетную запись (что хорошо, но через некоторое время становится раздражающим).

URL и командная строка

С помощью «wget» в варианте № 1 и службы Cron в варианте № 3 вам нужно будет сделать свои indexAction и icalAction доступными через http. Это может быть важным соображением. Даже если вы добавите некоторую проверку (проверив код, который вы отправляете через строку запроса или сообщение), все еще возможно, что любой в Интернете может активировать эти функции, если он знает правильный «секретный» URL-адрес. Доступ к вашим методам ical и index через http имеет дополнительное преимущество, заключающееся в том, что вы можете легко вызывать их, если хотите вручную запустить эти сценарии для принудительного обновления.

С подходом CLI, упомянутым Зденеком, вы создаете консольный маршрут в ZF2, и единственный способ запустить этот маршрут — через командную строку. Обычно это предпочтительнее, потому что ваши методы index и ical не будут доступны для http, но это не всегда вариант в зависимости от настроек вашего хостинга, и это может не вызывать серьезных проблем в зависимости от того, что эти функции делают с вашими данными и общедоступным веб-сайтом. .

person BPosey    schedule 04.11.2013
comment
BPosey, Спасибо за подробное объяснение. видите, на самом деле у меня есть эти действия (index и ical) в контроллере, который находится в модуле администратора, что означает, что для запуска файлов требуется аутентификация. Если я укажу URL вида eveparis.com/admin/add-from-source/ index и eveparis.com/admin/add-from-source/ ical на сайте setcronjob.com, это работает? Потому что для запуска файлов вручную требуется аутентификация. - person raghuveer999; 05.11.2013
comment
Насколько мне известно, SetCronjob поддерживает единственный тип аутентификации: Базовая HTTP-аутентификация. Я подозреваю, что у вашего администратора есть правильная страница входа, требующая адрес электронной почты/пароль, а это означает, что вам нужно будет разработать собственное решение, чтобы сделать эти функции доступными для SetCronjob. Возможно, вы можете создать CronController, который не требует аутентификации, и переместить туда свои индексные и ical функции? - person BPosey; 05.11.2013
comment
да, создание еще одного контроллера в другом модуле - хорошая идея.. спасибо за помощь - person raghuveer999; 06.11.2013

С Zf2 вы можете получить доступ к действиям контроллера из командной строки через CLI, это работает очень хорошо. Все, что вам нужно сделать, это добавить маршрутизацию в module.config.php.

return array(
  ......
 'console' => array(
    'router' => array(
        'routes' => array(
            'synch' => array(
                'options' => array(
                    'route'    => 'synch (sites|items):task',
                    'defaults' => array(
                        'controller' => 'Application\Controller\Scheduled',
                        'action'     => 'synch'
                    )
                )
            ),
),

Как видите, он вызывает контроллер Application\Controller\Scheduled, действие синхронизации, там

public function synchAction()
{
    $task = $this->params('task');
    try{
        switch($task){
            case 'sites':
                   .......
            break; 
           case 'items':
                   .......
            break; 
        }

Затем вы можете создать простой сценарий оболочки zf2.sh

php /var/www/vhosts/mysite/httpdocs/public/index.php $1 $2

и в crontab добавить

0 6 * * * /home/admin/scripts/zf2.sh synch sites

или просто запустить из командной строки

./zf2.sh synch items
person Zdenek Machek    schedule 04.11.2013

Это зависит от вашего сервера и его установленной системы cron. Например, в Debian/Ubuntu это очень просто http://www.pantz.org/software/cron/croninfo.html

Вы можете использовать этот полезный модуль для создания cron: https://github.com/heartsentwined/zf2-cron

person Remi Thomas    schedule 04.11.2013