Библиотека PHP для управления программными заданиями GNU/Linux Cron.
Это позволяет вам:
crontab (должна быть уже установлена в вашем распределении).sudo , если вы хотите управлять Crontab другого пользователя, чем пользователя времени выполнения, не сталкиваясь с правильными проблемами (см. Ниже) Библиотека может быть установлена с помощью композитора.
composer require tiben/crontab-manager ~1.0
Библиотека состоит из трех классов:
CrontabJob - это класс организации, который представляет собой работу Cron.CrontabRepository используется для сохранения/извлечения ваших рабочих мест Cron.CrontabAdapter обрабатывает устойчивость Cron в Crontab.Чтобы работать, Contabrepository нужен экземпляр Crontabadapter.
$crontabRepository = new CrontabRepository(new CrontabAdapter());
Предположим, вы хотите создать новую работу, которая состоит из запуска команды "df >> /tmp/df.log" каждый день в 23:30. Вы можете сделать это двумя способами.
По чистому пути:
$crontabJob = new CrontabJob();
$crontabJob
->setMinutes(30)
->setHours(23)
->setDayOfMonth('*')
->setMonths('*')
->setDayOfWeek('*')
->setTaskCommandLine('df >> /tmp/df.log')
->setComments('Logging disk usage'); // Comments are persisted in the crontab
Из строки с сырой синтаксисом Cron с использованием фабричного метода:
$crontabJob = CrontabJob::createFromCrontabLine('30 23 * * * df >> /tmp/df.log');
Теперь вы можете добавить свой новый Cronjob в репозиторий Crontab и сохранить все изменения в Crontab.
$crontabRepository->addJob($crontabJob);
$crontabRepository->persist();
Предположим, мы хотим изменить час уже существующего Cronjob. Поиск работы выполняется с использованием некоторых регулярных выражений. Режим корпуса применяется ко всей линии Crontab.
$results = $crontabRepository->findJobByRegex('/Logging disk usage/');
$crontabJob = $results[0];
$crontabJob->setHours(21);
$crontabRepository->persist();
Вы можете удалить работу как это:
$results = $crontabRepository->findJobByRegex('/Logging disk usage/');
$crontabJob = $results[0];
$crontabRepository->removeJob($crontabJob);
$crontabRepository->persist();
Примечание. Поскольку рабочие места Cron внутренне соответствуют ссылке, они должны быть ранее получены из репозитория или добавлены ранее.
Эта функция позволяет вам управлять Crontab другого пользователя, чем пользователя, который запустил время выполнения. Это может быть полезно, когда пользователь времени выполнения является www-data , но владелец Crontab, который вы хотите отредактировать, является вашей собственной учетной записью пользователя Linux.
Для этого просто передайте имя пользователя владельца Crontab в качестве параметра конструктора Crontabadapter. Предположим, что вы www-data , и вы хотите отредактировать Crontab пользователя bobby :
$crontabAdapter = new CrontabAdapter('bobby');
$crontabRepository = new CrontabRepository($crontabAdapter);
Используя этот путь, вы, вероятно, столкнетесь с проблемами прав пользователей. Это может быть обработано, редактируя ваш файл Sudoers с помощью «Visudo».
Если вы хотите позволить пользователю www-data редактировать Crontab пользователя bobby , добавьте эту строку:
www-data ALL=(bobby) NOPASSWD: /usr/bin/crontab
Что говорит Sudo не просить пароля, когда пользователь www-data вызывает crontab в качестве пользователя bobby использующего sudo
Теперь вы можете получить доступ к Crontab пользователя bobby как это:
$crontabAdapter = new CrontabAdapter('bobby', true);
$crontabRepository = new CrontabRepository($crontabAdapter);
Обратите внимание на второй параметр, true для вызова конструктора Crontabadapter. Этот логин говорит Crontabadapter использовать sudo внутренне при вызове crontab .
Вы можете включить или отключить задание Cron, используя метод setEnabled() объекта Cronjob соответственно:
$crontabJob->setEnabled(false);
Это приведет вашу работу Cron с # в вашем Crontab, когда он будет упорно ее.
Кроме того, если вы не можете прочитать Crontabs другого пользователя или если вы находитесь в распределенной архитектуре, где Crons не запускаются на машине, выполняющей задание, вы можете создать любой другой адаптер для вашей архитектуры, внедрив CrontabAdapterInterface .
Затем вы можете создать экземпляр CrontabRepository с вашим адаптером.
Тесты были записаны с использованием Phpunit и требуют версии 5.3+. Для выполнения тестов:
$ phpunit <crontab-library-path>/tests
Если вы установили библиотеку с помощью композитора и установленных зависимости от DEV, вы можете выполнить их, используя Phpunit в качестве зависимости:
$ ./vendor/bin/phpunit <crontab-library-path>/tests
... приветствуются :)