Страница 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
Было бы замечательно в таком случае посмотреть
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