Страница 1 из 2

Управление автоматическим запуском консольных команд

Добавлено: 2012.01.04, 04:46
Yiivgeny
PHPDocCrontab
Расширение для Yii Framework добавляющее возможность удобно управлять автоматическим запуском консольных команд используя синтаксис phpDocumentor и crontab.

Возможности и преимущества
  • Полностью идентичный синтаксис для Unix и Windows платформ (сходный со стандартным синтаксисом crontab)
  • Установка времени запуска каждого экшена команды в отдельности, используя всего одно задание в системном планировщике
  • Установка дополнительных параметров запуска (аргументы, stderr, stdout)
  • Возможность отмечать каждый экшен тегами, т.е. группировать экшены в наборы команд (например для запуска разных наборов на разных серверах)
  • Быстрое отключение\включение всех запланированных заданий
  • Хранение расписания заданий вместе с исходными кодами приложения
Как это использовать?
Во-первых, необходимо снабдить каждый экшен, который вы желаете запускать автоматически phpDoc-комментарием похожим на этот

Код: Выделить всё

class TestCommand extends CConsoleCommand{    
    /**
     * Это действие будет запускаться каждый третий час на двенадцатой минуте
     * 
     * @cron 12  *\3  *  *  *
     */
    public function actionTest(){;}    
}
Во-вторых, вы должны скачать расширение отсюда https://github.com/Yiivgeny/Yii-PHPDocCrontab/downloads, распаковать его в папку расширений

Далее необходимо внести изменения в конфигурацию вашего приложения, добавив директиву

Код: Выделить всё

..., 
 'commandMap' => array(
    'cron' => 'ext.PHPDocCrontab.PHPDocCrontab'
),
... 
И последним шагом, вам необходимо установить в планировщик заданий запуск этого скрипта каждую минуту, чтобы расширение могло запускать ваши команды. Например добавить вот такое задание в cron:

Код: Выделить всё

* * * * * /path/to/your/application/protected/yiic cron
Теперь вам достаточно добавлять\редактировать\убирать комменитарии из исходного кода, чтобы управлять соответствующими заданиями.

Требования
Необходим Yii Framework версии 1.1.6 или старше.

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

В планах добавить следующее, если кого-то заинтересует:
  • Полную документацию по уже реализованным возможностям
  • Улучшить работу с перенаправлением вывода (подстановки, использование алиасов Yii)
  • Использовать кеш для получения списка заданий
С нетерпением жду комментариев. Заранее спасибо

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

Добавлено: 2012.01.04, 10:45
PixoiD
Что то не работает
добавил:

Код: Выделить всё

/**
     * @cron * * * * *
     */
    public function actionTest(){ 

Код: Выделить всё

'commandMap' => array(
        'mapper' => 'ext.W3CronCommand.W3CronCommand'
    ),

    'components'=>array(... 

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

Добавлено: 2012.01.04, 12:02
Yiivgeny
А в системный плнанировщик добавили? В вашем случае (application/protected/yiic mapper)
Yii какой версии? ОС?

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

Добавлено: 2012.01.04, 12:20
PixoiD
все добавил Yii 1.1.9 система debian 6

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

Добавлено: 2012.01.04, 12:37
Yiivgeny
На всякий случай посмотрите наличие задания с помощью команды
./yiic mapper view

И попробуйте создать папку logs в runtime, а в исходниках я поправлю вскоре, если дело только в этом

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

Добавлено: 2012.01.04, 12:55
PixoiD
./yiic mapper view

отдает:

Action tests.test on * * * *
(default)

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

Добавлено: 2012.01.04, 12:59
Yiivgeny
Создание папки (и возможности записи в нее) решило проблему?
Если не хотите создавать директорию, можете воспользоваться тегом
@cron-stdout /dev/null

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

Добавлено: 2012.01.04, 13:07
PixoiD
Yiivgeny писал(а):Создание папки (и возможности записи в нее) решило проблему?
Если не хотите создавать директорию, можете воспользоваться тегом
@cron-stdout /dev/null
нет сам крон отрабатывает а вот мой тест нет...((( печалька , даже не могу понять по чему

подебажил и вот после это цикала выходит

Код: Выделить всё

foreach ($now AS $key => $piece){
                    //Проверяем наличие текущей части даты в дате исполнения задания
                    if (!in_array($piece, $task['docs'][0][$key])) continue 2;
                } 

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

Добавлено: 2012.01.04, 13:13
Yiivgeny
У вас точно верно задание вписано? Потому что на view не хватает куска даты (только 4 звездочки вместо 5)

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

Добавлено: 2012.01.04, 13:16
PixoiD
Yiivgeny писал(а):У вас точно верно задание вписано? Потому что на view не хватает куска даты (только 4 звездочки вместо 5)
я извиняюсь просто в консоли не влезло а так там 5*

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

Добавлено: 2012.01.04, 13:23
Yiivgeny
Было бы замечательно в таком случае посмотреть

Код: Выделить всё

var_dump($task['docs'][0], $now); 

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

Добавлено: 2012.01.04, 13:31
PixoiD

Код: Выделить всё

Array
(
    [0] => Array
        (
            [0] => 0
            [1] => 1
            [2] => 2
            [3] => 3
            [4] => 4
            [5] => 5
            [6] => 6
            [7] => 7
            [8] => 8
            [9] => 9
            [10] => 10
            [11] => 11
            [12] => 12
            [13] => 13
            [14] => 14
            [15] => 15
            [16] => 16
            [17] => 17
            [18] => 18
            [19] => 19
            [20] => 20
            [21] => 21
            [22] => 22
            [23] => 23
            [24] => 24
            [25] => 25
            [26] => 26
            [27] => 27
            [28] => 28
            [29] => 29
            [30] => 30
            [31] => 31
            [32] => 32
            [33] => 33
            [34] => 34
            [35] => 35
            [36] => 36
            [37] => 37
            [38] => 38
            [39] => 39
            [40] => 40
            [41] => 41
            [42] => 42
            [43] => 43
            [44] => 44
            [45] => 45
            [46] => 46
            [47] => 47
            [48] => 48
            [49] => 49
            [50] => 50
            [51] => 51
            [52] => 52
            [53] => 53
            [54] => 54
            [55] => 55
            [56] => 56
            [57] => 57
            [58] => 58
            [59] => 59
        )

    [1] => Array
        (
            [0] => 0
            [1] => 1
            [2] => 2
            [3] => 3
            [4] => 4
            [5] => 5
            [6] => 6
            [7] => 7
            [8] => 8
            [9] => 9
            [10] => 10
            [11] => 11
            [12] => 12
            [13] => 13
            [14] => 14
            [15] => 15
            [16] => 16
            [17] => 17
            [18] => 18
            [19] => 19
            [20] => 20
            [21] => 21
            [22] => 22
            [23] => 23
        )

    [2] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 3
            [3] => 4
            [4] => 5
            [5] => 6
            [6] => 7
            [7] => 8
            [8] => 9
            [9] => 10
            [10] => 11
            [11] => 12
            [12] => 13
            [13] => 14
            [14] => 15
            [15] => 16
            [16] => 17
            [17] => 18
            [18] => 19
            [19] => 20
            [20] => 21
            [21] => 22
            [22] => 23
            [23] => 24
            [24] => 25
            [25] => 26
            [26] => 27
            [27] => 28
            [28] => 29
            [29] => 30
            [30] => 31
        )

    [3] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 3
            [3] => 4
            [4] => 5
            [5] => 6
            [6] => 7
            [7] => 8
            [8] => 9
            [9] => 10
            [10] => 11
            [11] => 12
        )

    [4] => Array
        (
            [0] => *
        )

)
Array
(
    [0] => 31
    [1] => 14
    [2] => 4
    [3] => 1
    [4] => 3
) 
Нашел где косяк

Код: Выделить всё

$dimensions = array(
            array(0,59), //Minutes
            array(0,23), //Hours
            array(1,31), //Days
            array(1,12), //Months
            array(0,6),  //Weekdays
        );
        foreach ($parameters AS $n => &$repeat) {
//Добавить trim
            $repeat = trim($repeat);
 

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

Добавлено: 2012.01.04, 16:00
Yiivgeny
Обновил архив и первый пост.
  • Добавлена директива для установки папки в которую будут складываться логи.
  • Папка для логов по умолчанию изменена с runtime/logs/ на /runtime/
  • Исправлена ошибка с пробелами в phpDoc-тегах

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

Добавлено: 2012.01.04, 16:01
Yiivgeny
PixoiD писал(а):Нашел где косяк
Благодарю за помощь.

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

Добавлено: 2012.01.05, 19:19
nizsheanez
Вещь конечно классная.
Надо развивать!

Пожелания:
1. Что бы логи писал хорошие
2. Добавить поддержку событий, скажем если команда выкинула исключение, то выполнить такой-то набор команд. Тогда можно будет на эти события повесить отправку стека на почту и т.п.

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

Добавлено: 2012.01.05, 19:44
Yiivgeny
1) Логи чего именно?
2) Мм, каждая команда запускается отдельным процессом и дальше за ней нет никакого слежения, соответственно отсылка на почту и отлов исключений это мне кажется задача именно самих команд. Или я что-то не понял?

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

Добавлено: 2012.01.11, 16:20
Yiivgeny
Несколько изменений в настройках.
Так же добавлено логирование через Yii::log
Добавлены нормальные примеры синтаксиса.

Код: Выделить всё

class ExampleCommand extends CConsoleCommand{

    /**
     * Простой пример.
     * Запуск каждый час на 10-ой минуте.
     *
     * @cron 10 * * * *
     */
    public function actionexample1(){}

    /**
     * Пример тегирования.
     * Действие будет запущено только если расширение запускается командой содержащий тег "dbserver" или "cacheserver".
     * Например так: `./yiic cron run   dbserver storageserver`
     *
     * @cron 10 * * * *
     * @cron-tags dbserver cacheserver
     */
    public function actionexample2(){}

    /**
     * Пример перенаправления STDOUT и STDERR в один и тот же файл.
     *
     * @cron 10 * * * *
     * @cron-stdout /tmp/ExampleCommand.log
     */
    public function actionexample3(){}

    /**
     * Пример перенаправления STDOUT и STDERR в разные файлы.
     *
     * @cron 10 * * * *
     * @cron-stdout /tmp/ExampleCommand.log
     * @cron-stderr /tmp/ExampleCommandError.log
     */
    public function actionexample4(){}

    /**
     * Пример перенаправления STDERR в файл (STDOUT выводится в файл по умолчанию).
     *
     * @cron 10 * * * *
     * @cron-stderr /dev/null
     */
    public function actionexample5(){}

    /**
     * Пример команды с аргументами.
     * Аргументы вводятся точно так же как и при обычном запуске через консоль, с сохранением всех возможностей.
     *
     * @cron 10 * * * *
     * @cron-args --limit=5 --offset=10
     */
    public function actionexample6($limit, $offset){}

    /**
     * Пример расширенного использования времени запуска.
     * Действие будет запускаться
     * каждую 10, 25, 26, 27, 28, 29, 30, 40 минуту
     * каждого 2-го (четного) часа
     * с 15 по 21, и с 23 по 27 число
     * каждого 2-го (четного) месяца в период с января по июнь включительно
     * независимо от дня недели.
     *
     * @cron 10,25-30,40 *\2 15-21,23-27 1-6\2 *
     */
    public function actionexample7(){}

    /**
     * Все описанные конструкции могут использоваться совместно и в любом порядке.
     *
     * @cron 10,25-30,40 *\2 15-21,23-27 1-6\2 *
     * @cron-stderr /dev/null
     * @cron-args --limit=5 --offset=10
     * @cron-tags dbserver cacheserver
     * @cron-stdout /tmp/ExampleCommand.log
     */
    public function actionexample8($limit, $offset){}
} 
И описание конфигурации

Код: Выделить всё

/**
 * Конфигурация с заменой параметров.
 * Примечание: каждая из перечисленных ниже опций может быть динамически определена во время запуска.
 * Пример: `./yiic cron run --optionName=optionValue`
 */
return array (
    'commandMap' => array(
        'cron' => array(
            'class' => 'ext.PHPDocCrontab.PHPDocCrontab',
            /**
             * Префикс тегов при парсинге (по умолчанию cron)
             * Изменяя вы можете иные теги-задания, например
             * @mycron * * * *
             * @mycron-stderr /dev/null
             */
            'tagPrefix' => 'mycron',
            /**
             * Принудительная установка исполняемого файла интерпретатора
             */
            'interpreterPath' => '/usr/local/bin/php -d foo=bar',
            /**
             * Установка папки по умолчанию для сохранения логов.
             * Используется если задание указано без @cron-stdout
             * По умолчанию application.runtime
             */
            'logsDir' => '/var/log/yiiapp/',
            /**
             * Принудительная установка bootstrap-скрипта.
             * По умолчанию используется скрипт с помощью которого запущено само расширение.
             */
            'bootstrapScript' => __DIR__.DIRECTORY_SEPARATOR.'..'.DIRECTORY_SEPARATOR.'yiicMod.php',
            /**
             * Временная метка в формате поддерживаемом функцией strtotime,
             * которая будет использована в качестве текущей при запуске заданий.
             *
             * Можно использовать для запуска всех необходимых скриптов, если время запуска было пропущено.
             * Так же можно использовать как метод коррекции часовых поясов сервера по отношению к приложению.
             */
            'timestamp' => 'now - 1 hour 25 minutes'
        )
    )
); 

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

Добавлено: 2012.05.18, 01:09
Insolita
Очень интересная идея, к сожалению скачать расширение по ссылке не получается -( Где его найти можно?

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

Добавлено: 2012.05.18, 01:29
Yiivgeny
Было желание выложить в офф репозиторий, но ввиду малой заинтересованности так и откладывается.
Переименовано и переехало на гитхаб. https://github.com/Yiivgeny/Yii-PHPDocCrontab

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

Добавлено: 2012.05.30, 02:00
Yiivgeny