jenner / crontab
php crontab base on pcntl and libev
Installs: 862
Dependents: 0
Suggesters: 0
Security: 0
Stars: 305
Watchers: 32
Forks: 97
Open Issues: 3
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
php crontab base on pcntl and react/event-loop
Why use php_crontab?
When we have a handful of crontab tasks, crontab service is enough for us to manage them. If we have many crontab tasks, there will be some problems like:
- The crontab tasks are managed in a text file. If there are no comment, it will be hard for fresh man to understand what they are.
- If the crontab tasks are distributed in different servers, it will be hard to manage them.
- If you want to collect the crontab tasks' logs, it will be not easy.
- Tasks of different users must written in different files. Based on the above reasons, we need a crontab manager which can manage crontab tasks together and configure the tasks.
How to use php_crontab?
First composer require jenner/crontab
.
There are two ways to use php_crontab to manage your crontab tasks.
You can just write a php script and add it to the crontab config file
with the command crontab -e
. The php script should run every minute. For example tests/simple.php
Or you can write a php daemon script which will run as a service and will not exit until someone kill it.
It will check the tasks every minute. For example tests/daemon.php
Import
composer require jenner/crontab
Properties
- The crontab tasks can be stored in any way you what. For example, mysql, reids. What's more? You can develop a web application to manage them.
- The tasks of different users can be managed together.
- Multi-Process, every task is a process.
- You can set the user and group of a crontab task
- STDOUT can be redirected
- Based on react/event-loop, it can run as a daemon.
- A HTTP server which you can manage the crontab tasks through it.
- Dynamic task loader, you can register a task loader by Daemon::registerTaskLoader, which will execute every 60 seconds and update the crontab tasks.
HTTP interfaces
HTTP METHOD: GET
add
add new task to crontab serverget_by_name
get task by nameremove_by_name
remove task by nameclear
clear all taskget
get all tasksstart
start crontab loopstop
stop crontab loop
Examples:
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
TODO
- add log handler interface.
- add http log handler, socket log handler, file handler and so on.
- separate stdout and stderr. use different handlers
run based on crontab service
* * * * * 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());
run as a daemon
it will check the task configs every minute.
$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();
Or use the task loader
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();
run as a daemon and start the http server
$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);
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
run the script
[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 &