PHP库以编程为GNU/Linux Cron作业。
它使您能够:
crontab命令行实用程序(应该在您的分发中安装)。sudo ,如果您想管理另一个用户的crontab,而不是运行时用户而没有遇到正确的问题(请参见下文) 可以使用作曲家安装库。
composer require tiben/crontab-manager ~1.0
该库由三个类组成:
CrontabJob是代表Cron工作的实体类。CrontabRepository用于持久/检索您的Cron作业。CrontabAdapter处理crontab中的Cron Jobs持久性。为了工作,Crontabrepository需要一个crontabadapter的实例。
$crontabRepository = new CrontabRepository(new CrontabAdapter());
假设您要创建一个新作业,该作业包括每天在23:30启动命令“ DF >> /tmp/df.log”。您可以通过两种方式进行。
以纯粹的方式:
$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 ,您想编辑用户bobby的crontab:
$crontabAdapter = new CrontabAdapter('bobby');
$crontabRepository = new CrontabRepository($crontabAdapter);
使用这种方式,您将建议您遇到用户权利问题。可以通过使用“ Visudo”编辑您的Sudoers文件来处理这。
如果要允许用户www-data编辑用户bobby的crontab,请添加此行:
www-data ALL=(bobby) NOPASSWD: /usr/bin/crontab
它告诉sudo用户www-data使用sudo将crontab称为用户bobby时不要询问密码
现在,您可以这样访问用户bobby的crontab:
$crontabAdapter = new CrontabAdapter('bobby', true);
$crontabRepository = new CrontabRepository($crontabAdapter);
请注意Crontabadapter构造函数的第二个参数true 。该布尔值告诉Crontabadapter在调用crontab时内部使用sudo 。
您可以通过相应地使用cronjob对象的setEnabled()方法来启用或禁用cron作业:
$crontabJob->setEnabled(false);
在坚持下去时,这将使您的cron工作在crontab中使用# 。
此外,如果您无法读取其他用户的crontabs,或者您在没有在执行作业的机器上运行CRON的分布式体系结构,则可以通过实现CrontabAdapterInterface创建任何其他适配器。
然后,您可以使用适配器实例化CrontabRepository 。
测试是使用Phpunit编写的,需要5.3版以上的版本。执行测试:
$ phpunit <crontab-library-path>/tests
如果您使用作曲家和安装的Dev依赖性安装了库,则可以使用随附的phpunit作为依赖项执行它们:
$ ./vendor/bin/phpunit <crontab-library-path>/tests
...欢迎:)