基於pcntl和react/event-loop的定時任務管理器php
當咱們有少許的定時任務須要管理時,unix的crontab服務時足夠的。若是咱們有很是多的定時任務 須要管理時,機會有一些問題,例如:mysql
crontab服務經過一個文本文件管理定時任務,若是沒有註釋,對新人來講去理解他們是比較難的。react
若是定時任務分散在許多機器上,管理他們也是比較難的。git
若是你想收集他們的日誌,一樣不會簡單。github
不一樣用戶的定時任務分散在不一樣的文件中。 基於以上幾點緣由,咱們須要一個能夠統一管理配置的定時任務管理器。redis
有兩種方式使用php_crontab管理你的定時任務。 你能夠寫一個腳本,而後把它加入到crontab服務器中,每分鐘執行一次。例如tests/simple
。 或者你能夠寫一個守護進程腳本,它會像一個服務同樣一隻運行,直到你殺死它。 它將每分鐘檢查一次定時任務。例如tests/daemon.php
sql
定時任務管理能夠被存儲在任何地方。例如:mysql、redis等。服務器
定時任務的日誌能夠根據你的須要進行配置curl
多個用戶的定時任務能夠統一管理ide
多進程,每一個任務一個進程
你能夠爲每一個任務設置用戶和用戶組
標準輸出能夠進行重定向
基於react/event-loop,它能夠做爲一個守護進程運行
一個HTTP服務器,你能夠經過它管理定時任務
HTTP 方法: GET
add
增長任務
get_by_name
根據任務名稱獲取任務
remove_by_name
根據任務名稱刪除任務
clear
刪除全部任務
get
獲取全部任務
start
開始檢測定時任務
stop
中止檢測定時任務
示例:
http://host:port/add?name=name&cmd=cmd&time=time&out=out&user=user&group=group&comment=comment http://host:port/get_by_name?name=name http://host:port/remove_by_name?name=name http://host:port/clear http://host:port/get http://host:port/start http://host:port/stop
基於crontab服務運行
* * * * * php demo.php
<?php$missions = [ [ 'name' => 'ls', 'cmd' => "ls -al", 'out' => '/tmp/php_crontab.log', 'time' => '* * * * *', 'user' => 'www', 'group' => 'www' ], [ 'name' => 'hostname', 'cmd' => "hostname", 'out' => '/tmp/php_crontab.log', 'time' => '* * * * *', ],];$tasks = array();foreach($missions as $mission){ $tasks[] = new \Jenner\Crontab\Mission($mission['name'], $mission['cmd'], $mission['time'], $mission['out']);}$crontab_server = new \Jenner\Crontab\Crontab(null, $tasks);$crontab_server->start(time());
做爲一個守護進程運行
it will check the task configs every minute.
$missions = [ [ 'name' => 'ls', 'cmd' => "ls -al", 'out' => '/tmp/php_crontab.log', 'time' => '* * * * *', 'user' => 'www', 'group' => 'www' ], [ 'name' => 'hostname', 'cmd' => "hostname", 'out' => '/tmp/php_crontab.log', 'time' => '* * * * *', ],];$daemon = new \Jenner\Crontab\Daemon($missions);$daemon->start();
做爲守護進程運行同時啓動一個http server
$missions = [ [ 'name' => 'ls', 'cmd' => "ls -al", 'out' => '/tmp/php_crontab.log', 'time' => '* * * * *', ], [ 'name' => 'hostname', 'cmd' => "hostname", 'out' => '/tmp/php_crontab.log', 'time' => '* * * * *', ],];$http_daemon = new \Jenner\Crontab\HttpDaemon($missions, "php_crontab.log");$http_daemon->start($port = 6364);
Then you can manage the crontab task by curl like:
curl http://127.0.0.1:6364/get_by_name?name=ls curl http://127.0.0.1:6364/remove_by_name?name=hostname curl http://127.0.0.1:6364/get
啓動腳本
[root@jenner php_crontab]# ./bin/php_crontab php_crontab help: -c --config crontab tasks config file -p --port http server port -f --pid-file daemon pid file -l --log crontab log file [root@jenner php_crontab]#nohup ./bin/php_crontab -c xxoo.php -p 8080 -f /var/php_crontab.pid -l /var/logs/php_crontab.log
https://github.com/huyanping/php_crontab/blob/master/README.zh.md