jenner/crontab

基于pcntl和libev的php crontab

v1.5.1 2015-10-23 04:28 UTC

This package is auto-updated.

Last update: 2024-09-14 12:40:06 UTC


README

Latest Stable Version Total Downloads Latest Unstable Version License License

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

博客:www.huyanping.cn