smichaelsen/php-cron-scheduler

PHP Cron作业调度器

v1.1 2015-11-22 11:08 UTC

This package is auto-updated.

Last update: 2024-08-29 04:08:49 UTC


README

Build Status Latest Stable Version Total Downloads Latest Unstable Version License

这是一个简单的cron作业调度器,灵感来自Laravel任务调度

通过Composer安装

推荐的方式是通过Composer安装php-cron-scheduler。

请参阅入门指南了解如何下载和安装Composer。

下载/安装Composer后,运行

php composer.phar require peppeocchi/php-cron-scheduler

或添加包到您的composer.json

{
    "require": {
        "peppeocchi/php-cron-scheduler": "1.*"
    }
}

工作原理

您不必为每个要运行的cron作业在crontab中添加新条目,只需将一个cron作业添加到您的crontab中,并在您的.php文件中定义命令即可。

默认情况下,当您安排一个命令时,它将在后台运行,您可以通过调用->runInForeground()方法来覆盖此行为。

$scheduler->call('myFunction')->runInForeground()->every()->minute();

应将输出发送到电子邮件的作业始终设置为在前景运行

创建您的scheduler.php文件如下所示

<?php require_once __DIR__.'/../vendor/autoload.php';

use GO\Scheduler;

function myFunc() {
  return "Hello world from function!";
}

$scheduler = new Scheduler([
  'emailFrom' => 'myemail@address.from'
]);


/**
 * Schedule cronjob.php to run every minute
 *
 */
$scheduler->php(__DIR__.'/cronjob.php')->at('* * * * *')->output(__DIR__.'/cronjob.log');


/**
 * Schedule a php job to run with your bin
 *
 */
$scheduler->php(__DIR__.'/cronjob.php')->useBin('/usr/bin/php')->at('* * * * *')->output(__DIR__.'/cronjob_bin.log', true);


/**
 * Schedule a raw command to tun every minute between 00 and 04 of every hour,
 * send the output to raw.log
 * Pass `true` as a second parameter to append the output to that file
 *
 */
$scheduler->raw('ps aux | grep httpd')->at('* * * * *')->output(__DIR__.'/raw.log', true);


/**
 * Run your own function every day at 10:30
 *
 */
$scheduler->call('myFunc')->every()->day('10:30')->output(__DIR__.'/call.log');

$scheduler->call(function () {
    return "This works the same way";
  })->at('* * * * *')->output(__DIR__.'/call.log');

/**
 * Run only when your func returns true
 *
 */
$scheduler->php(__DIR__.'/cronjob.php')
  ->at('* * * * *')
  ->when(function () {
    return false;
  })->output(__DIR__.'/never_created.log');

/**
 * Send the output to an email address
 *
 */
$scheduler->call(function () {
    return "This will be sent via email";
  })->at('* * * * *')->output(__DIR__.'/call.log')->email('myemail@address.to');

$scheduler->run();

然后将它添加到您的crontab中

* * * * * path/to/phpbin path/to/scheduler.php 1>> /dev/null 2>&1

您就可以开始了。

配置

您可以将一个包含全局作业配置的数组传递给Scheduler构造函数

目前唯一支持的配置是发送作业执行结果时的发送者电子邮件地址

...
$config = [
  'emailFrom' => 'myEmail@address.com'
];

$scheduler = new Scheduler($config);
...

作业执行顺序

应运行的作业按其执行顺序排序:可以在后台运行的作业将首先执行

作业类型

创建一个新的Scheduler实例后,您可以添加几种类型的作业

  • ->php('myCommand'),执行一个PHP作业。如果需要,您可以设置自己的PHP_BINARY
$scheduler->php('myCommand')->useBin('myBin')
  • ->raw('myCommand'),在shell中执行原始命令,如果您想执行多个命令,如ps aux | grep memcached,可以使用此类型
  • ->call('myFunction'),执行您自己的函数
  • 您可以编写自己的解释器(如果您想,可以为此仓库添加解释器),只需扩展GO\Job\Job并定义build()方法,以及一个可选的init(),如果它需要在运行命令之前进行初始化(例如,定义bin路径)

输出

您可以将cron作业的执行输出发送到文件和电子邮件地址。

  • ->output('myfile')将覆盖该文件(如果存在)
  • ->output('myfile', true)将附加到该文件(如果存在)如果您想将输出发送到电子邮件地址,您需要首先将输出发送到文件。该文件将附加到电子邮件中
  • ->output('myfile')->email('myemail')如果您想将输出发送到多个文件/电子邮件,可以传递文件或电子邮件的数组 -> output(['first_file', 'second_file'])->email(['myemail1' => 'Dev1', 'myemail2' => 'Dev2'])

条件

您可以将cron作业的执行委托给一个真实的测试。

$scheduler->raw('command')->when(function () {
    .....
    return true;
  });

调度时间

Scheduler使用Cron\CronExpression作为表达式解析器。

您可以使用->at('myCronExpression')方法来安排任务,并将cron表达式(例如* * * * *)或由mtdowling/cron-expression支持的任何表达式传递给它。

您还可以选择使用“优雅的排程”,允许您以优雅的方式定义时间。为此,您应该调用->every()后跟

  • ->minute(),任务将被安排每分钟运行一次
  • ->hour('02')任务将被安排每小时运行一次。默认minute00,但您可以用自己的minute来覆盖它(在示例中,它将在每小时的02分钟运行)
  • ->day('10:23')任务将被安排每天运行一次。默认的hour:minute00:00,但您可以用自己的hour:minute来覆盖它
  • ->month('25 10:30')任务将被安排每月运行一次。默认的day hour:minute01 00:00,但您可以用自己的day hour:minute来覆盖它