Менеджер задач для cron'а на PHP
Часто на проекте требуется выполнять некие периодические действия и для этого мы используем замечательный планировщик cron. Эти действия являются (скорее всего) частью работы проекта, но находясь в cron’e они “оторваны” от проекта. Я придерживаюсь мнения, что все, что относится к проекту, должно находиться в оном месте.
Поэтому и был написан планировщик, который создавал бы единую точку входа задач, позволяя хранить все задачи в проекте, а не в crontab. У такого решения есть несколько преимуществ:
- За пределами проекта нет важных данных, которые можно потерять при переносе. Т.е. при переносе папки с проектом задачи переедут автоматически, удобно, не правда ли?
- Для изменения/добавления задачи не нужен шелл на сервере
- Не засирается crontab - там будет только одна задача для проекта
Итак, приступим к установке:
Создадим composer.json
{
"repositories": [
{
"type": "vcs",
"url": "https://github.com/azurre/scheduler"
}
],
"require": {
"azurre/php-scheduler": "master"
}
}
Устанавливаем:
composer install
Создаем точку входа для планировщика, назовм её scheduler.php
$loader = require_once __DIR__ . '/vendor/autoload.php';
use Azurre\Component\Cron\Scheduler;
$php = '/usr/bin/php';
$path = dirname(__FILE__) . '/';
$Scheduler = new Scheduler();
$Scheduler
->setJobPath($path)
->setLogsPath($path);
$Scheduler->addJob('*/10 * * * *', function ($logsPath, $jobPath) use ($php) {
// run standalone php script
$cmd = "{$php} {$jobPath}calculate.php >> {$logsPath}calculate.log 2>&1";
$result = `$cmd`;
});
echo date('d-m-Y H:i:s') . ' Run scheduler...' . PHP_EOL;
$Scheduler->run();
Добавляем в cron...
$ crontab -e
...запуск нашей точки входа каждую минуту:
* * * * * /usr/bin/php /path/to/project/scheduler.php >> /path/to/project/scheduler.log 2>&1
Все. Осталось добавлять задачи через $Scheduler->addJob()
Проект на Gitub: https://github.com/azurre/scheduler
В проекте вжнейшую роль играет парсер выражений крона: https://github.com/yalesov/php-cron-expr-parser
Комментарии (0)