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
...歡迎:)