jenner / crontab
基于pcntl和libev的php crontab
v1.5.1
2015-10-23 04:28 UTC
Requires
- php: >=5.3.0
- ext-posix: *
- jenner/simple_fork: 0.5
- monolog/monolog: 1.17.1
- react/http: v0.4.1
- symfony/process: v2.7.5
Requires (Dev)
- ext-redis: *
- guzzle/guzzle: v3.9.3
Suggests
- ext-event: ~1.0
- ext-libev: *
- ext-libevent: >=0.1.0
- ext-redis: *
- guzzle/guzzle: v3.9.3
README
基于pcntl和react/event-loop的php crontab
为什么使用php_crontab?
当我们只有少量crontab任务时,cron服务足以管理它们。如果我们有大量crontab任务,将出现一些问题,如
- crontab任务在文本文件中管理。如果没有注释,新手很难理解它们。
- 如果crontab任务分散在不同的服务器上,管理起来将很困难。
- 如果您想收集crontab任务的日志,这并不容易。
- 不同用户的任务必须写入不同的文件。基于上述原因,我们需要一个可以一起管理和配置crontab任务的crontab管理器。
如何使用php_crontab?
首先 composer require jenner/crontab
。
有两种方式使用php_crontab来管理您的crontab任务。您只需编写一个PHP脚本并将其添加到crontab配置文件中,使用crontab -e
命令。脚本应每分钟运行一次。例如 tests/simple.php
或者您可以编写一个PHP守护进程脚本,它将作为一个服务运行,直到有人将其杀死。它将每分钟检查一次任务。例如 tests/daemon.php
导入
composer require jenner/crontab
属性
- crontab任务可以以任何您希望的方式存储。例如,mysql,redis。更重要的是?您可以开发一个Web应用程序来管理它们。
- 可以一起管理不同用户的任务。
- 多进程,每个任务都是一个进程。
- 您可以为crontab任务设置用户和组
- STDOUT可以重定向
- 基于react/event-loop,它可以作为一个守护进程运行。
- 一个HTTP服务器,您可以通过它来管理crontab任务。
- 动态任务加载器,您可以通过调用Daemon::registerTaskLoader注册一个任务加载器,它将每60秒执行一次并更新crontab任务。
HTTP接口
HTTP方法:GET
add
向crontab服务器添加新任务get_by_name
通过名称获取任务remove_by_name
通过名称删除任务clear
清除所有任务get
获取所有任务start
开始crontab循环stop
停止crontab循环
示例
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
待办事项
- 添加日志处理程序接口。
- 添加http日志处理程序、socket日志处理程序、文件处理程序等。
- 分开stdout和stderr,使用不同的处理程序
基于crontab服务运行
* * * * * php demo.php
<?php $missions = [ [ 'name' => 'ls', 'cmd' => "ls -al", 'out' => '/tmp/php_crontab.log', 'err' => '/tmp/php_crontab.log', 'time' => '* * * * *', 'user' => 'www', 'group' => 'www' ], [ 'name' => 'ls', 'cmd' => "ls -al", 'out' => '/tmp/php_crontab.log', 'err' => '/tmp/php_crontab.log', 'time' => '* * * * *', 'user' => 'www', 'group' => 'www' ], ]; $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());
作为守护进程运行
它将每分钟检查一次任务配置。
$missions = [ [ 'name' => 'ls', 'cmd' => "ls -al", 'out' => '/tmp/php_crontab.log', 'err' => '/tmp/php_crontab.log', 'time' => '* * * * *', 'user' => 'www', 'group' => 'www' ], [ 'name' => 'ls', 'cmd' => "ls -al", 'out' => '/tmp/php_crontab.log', 'err' => '/tmp/php_crontab.log', 'time' => '* * * * *', 'user' => 'www', 'group' => 'www' ], ]; $daemon = new \Jenner\Crontab\Daemon($missions); $daemon->start();
或使用任务加载器
function task_loader() { $missions = [ [ 'name' => 'ls', 'cmd' => "ls -al", 'out' => '/tmp/php_crontab.log', 'time' => '* * * * *', 'user' => 'www', 'group' => 'www' ], [ 'name' => 'ls', 'cmd' => "ls -al", 'out' => '/tmp/php_crontab.log', 'time' => '* * * * *', 'user' => 'www', 'group' => 'www' ], ]; return $missions; } $daemon = new \Jenner\Crontab\Daemon(); $daemon->registerTaskLoader("task_loader"); $daemon->start();
作为守护进程运行并启动http服务器
$missions = [ [ 'name' => 'ls', 'cmd' => "ls -al", 'out' => '/tmp/php_crontab.log', 'err' => '/tmp/php_crontab.log', 'time' => '* * * * *', 'user' => 'www', 'group' => 'www' ], [ 'name' => 'ls', 'cmd' => "ls -al", 'out' => '/tmp/php_crontab.log', 'err' => '/tmp/php_crontab.log', 'time' => '* * * * *', 'user' => 'www', 'group' => 'www' ], ]; $http_daemon = new \Jenner\Crontab\HttpDaemon($missions, "php_crontab.log"); $http_daemon->start($port = 6364);
然后您可以通过curl来管理crontab任务,例如:
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 >/dev/null &