基于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