Действия по расписанию

Содержание...

Одной из часто встречающихся задач является организация выполнения приложением определенных действий автоматически по расписанию без участия пользователя. Примером такого действия может быть регулярная (раз в 10 минут) проверка и получение почты.

Управление расписанием выполнения задач фреймворк Вебасист предоставляет внешним системным утилитам. В Unix-подобных системах для выполнения задач по расписанию используется демон Cron. В Windows существует собственный планировщик задач, а также сторонние аналоги Cron.

Хотя Вебасист не содержит собственных средств управления расписанием запуска задач, он предлагает инфраструктуру для создания скриптов, которые могут запускаться из консоли и, соответственно, могут быть включены в расписание Cron.

Эта инфраструктура позволяет использовать в коде такого скрипта все классы приложения, в точности так, как это происходит в коде контроллера.

Создание скрипта для запуска из консоли

Для каждого действия, которое будет выполняться по расписанию, нужно создать файл wa-apps/[APP_ID]/lib/cli/[APP_ID][ACTION_NAME].cli.php

Например, wa-apps/mail/lib/cli/mailCheck.cli.php — скрипт, который будет проверять наличие новых писем.

В этом файле необходимо объявить класс, унаследованный от waCliController. В таком классе логика, выполняемая при вызове, должна содержаться в методе execute():

<?php 

class mailCheckCli extends waCliController
{

    public function execute()
    {
        // здесь код который должен запуститься
        // можно использовать модели и любые другие классы приложения

        echo "Hello world!";
    }

}

Запуск скрипта из консоли

Чтобы запустить из консоли код класса унаследованного от waCliController, необходимо выполнить команду вида:

php [ПУТЬ до корня устновки]/cli.php APP_ID ACTION_NAME

Для скрипта, описанного в примере выше эта команда будет следующей:

php /var/www/wa/cli.php mail Check

Вызов скрипта из консоли позволяет проверить работоспособность вашего скрипта.

Включение скрипта в расписание cron

Чтобы скрипт выполнялся периодически нужно добавить строку в конфигурационный файл Cron:

*/10 * * * * /usr/bin/php /var/www/wa/cli.php mail Check

Подробнее о конфигурировании заданий в Cron можно прочитать в разделе «Настройка Cron».

Создание инструкции для пользователей приложения

Чтобы упростить настройку Cron для пользователей вашего приложения рекомендуется создать файл:
wa-apps/APP_ID/lib/config/cron.php
в котором описать инструкции для Cron в виде:

<?php 

return array(
    'key' => 'строка для cron'
);

Например:

<?php 

return array(
   'check_mail'=>'*/10 * * * * /usr/bin/php -q '.wa()->getConfig()->getPath('root').DIRECTORY_SEPARATOR.'cli.php mail Check',
);

В класс Config вашего приложения (wa-apps/APP_ID/lib/config/[APP_ID]Config.class.php) можно добавить метод getCronJob:

public function getCronJob($name = null)
{
    static $tasks;
    if (!isset($tasks)) {
        $tasks = array();
        $path = $this->getAppConfigPath('cron');
        if (file_exists($path)) {
            $tasks = include($path);
        } else {
        $tasks = array();
        }
    }
    return $name?(isset($tasks[$name])?$tasks[$name]:null):$tasks;
}

Теперь в нужном месте вашего приложения вы можете вывести администратору сообщение:

Для корректной работы приложения необходимо настроить крон, для этого добавьте задание:
$this->getConfig()->getCronJob('check_mail')

Этот код вернёт строку для настройки cron:

*/10 * * * * /usr/bin/php -q /var/www/wa/cli.php mail Check

Замечания для использующих хостинг

Версия PHP в командной строке

На некоторых хостингах, в качестве обработчика PHP в консоли по умолчанию используется PHP4. Однако для работы фреймворка необходим PHP5.

В этом случае нужно /usr/bin/php заменить на путь до PHP5, который необходимо узнать вашего хостинг-провайдера.

Права доступа к папкам фреймворка

Желательно запускать команды cron от лица того же пользователя, что и веб-сервер. Это позволит избежать проблем с правами к папкам wa-cache и другим.

У большинства хостингов, как правило, такой проблемы нет. Однако, если вы используете VPS, то в конфигурационной строке Cron нужно указать пользователя, например www-data:

*/10 * * * * www-data /usr/bin/php -q /var/www/wa/cli.php mail Check