shabbyrobe/phonycron

此包已被弃用,不再维护。未建议替代包。

PHP cron

2.0.0 2015-09-14 01:42 UTC

This package is not auto-updated.

Last update: 2022-10-21 07:26:35 UTC


README

Phonycron 是一个基于 PHP 的 vixie cron 调度解析器。它被创建出来,以便能够将 cron 调度作为 PHP 项目的版本之一进行版本控制和维护,同时保持与现有的复杂 crontab 的兼容性。

它并不完全完整,但应该与您将使用的几乎所有 cron 作业兼容。有关更多信息,请参阅 限制 部分。

支持 PHP 5.6 到 7.2。

对于 PHP 5.3 到 5.5 的用户,这可能仍然可以工作,但如果它崩溃了,可以在以下位置找到适用于 PHP `<= 5.5` 的最后一个测试版本:https://github.com/shabbyrobe/phonycron/commit/14d2acc550689652f540d7ec520dca212160a700

安装

Phonycron 可以通过确保您的 composer.json 文件包含以下内容来使用 Composer 安装:

{
    "require": {
        "shabbyrobe/phonycron": "2.0.*"
    }
}

您也可以直接从 GitHub <http://github.com/shabbyrobe/phonycron>_ 页面下载 Phonycron

快速入门

在您的项目中创建一个名为 crontab 的 crontab 文件,内容如下:

# every minute
* * * * * script1.php

# every hour
0 * * * * script2.php

script1.phpscript2.php 添加到您的项目中

<?php
// script1.php
echo "Script 1";
<?php
// script2.php
echo "Script 2";

在您的项目中创建一个名为 cron.php 的 PHP 脚本,内容如下:

require 'vendor/autoload.php';

$crontab = file_get_contents(__DIR__.'/crontab');
$controller = new \Phonycron\Controller($crontab, __DIR__);
$controller->run();

或者如果您喜欢更困难的方式

<?php
require 'vendor/autoload.php';

// Parse the crontab 
$tz = new \DateTimeZone('Australia/Melbourne');
$parser = new Phonycron\Parser($tz);
$jobs = $parser->parse(file_get_contents(__DIR__.'/crontab'));


// Create a runner and optional output handler
$cronWorkingDirectory = __DIR__;
$runner = new Phonycron\SystemRunner($cronWorkingDirectory);
$runner->outputHandler = new Phonycron\EchoOutputHandler();

// Run all jobs that are due to be run at time()
$runner->run($jobs, time());

测试一下

php cron.php

将其添加到系统 crontab 中,每分钟运行一次

cat <( crontab -l ) <( echo "* * * * * php /path/to/your/project/cron.php" ) | crontab -

Phonycron 遵循 PSR-0 标准,因此您可以使用任何支持此标准的自动加载器。

自定义

Phonycron 默认提供了一组非常有限的输出处理程序和运行器。尽管如此,创建自己的非常容易。

运行器

通过扩展 Phonycron\Runner 并实现 runDue 方法来创建自己的自定义运行器。当作业即将运行时,会调用该方法,并传递一个 Phonycron\Job 实例。在 Phonycron\Job$command 属性中包含 crontab 条目的命令部分。

如果您想让 crontab 定义需要 PHP 脚本的,而不是运行系统命令,可以创建一个运行器,如下所示:

<?php
class RequireRunner extends Phonycron\Runner
{
    public $scriptDir;
    
    public function __construct($scriptDir)
    {
        $this->scriptDir = $scriptDir;
    }
    
    protected function runDue(Phonycron\Job $job)
    {
        // careful - make sure your inputs are sanitised!
        $fullPath = realpath($this->scriptDir.'/'.$job->command);
        if (!$fullPath)
            throw new \RuntimeException("Script $fullPath not found");
        if (strpos($fullPath, $this->scriptDir)!==0)
            throw new \RuntimeException("Path breakout");
        
        require($fullPath);
    }
}

输出处理程序

Phonycron 默认会吞咽所有输出。如果您的 Phonycron\Runner 在其 $outputHandler 属性中有一个 Phonycron\OutputHandler 实例,则每个作业的输出将传递给它。

如果您想将输出记录到文件中,可以创建一个输出处理程序,如下所示:

<?php
class FileLogHandler implements OutputHandler
{
    public $file;
    public $handle;
    
    public function __construct($file)
    {
        $this->file = $file;
        $this->handle = fopen($this->file, 'a');
    }
    
    public function handle(Phonycron\Job $job, $output)
    {
        fwrite($this->handle, $output.PHP_EOL);
    }
    
    public function __destruct()
    {
        fclose($this->handle);
    }
}

限制

Phonycron 没有实现典型的 Unix 系统cron所实现的所有功能。

  • 混合匹配列表和范围

    例如,1-15,32,55 * * * * 表示前十五分钟每分钟一次,然后是第三十二分钟一次,第五十五分钟一次。

  • “每月的某一天”字段中的 W 修饰符

    例如,* * 3W * * 表示离每月3号最近的星期几。

  • “星期几”字段中的 # 修饰符

    例如,0 0 ? 1 3#2 表示一月份的第二个星期三。

  • @reboot

许可证

Phonycron 在 MIT 许可证下发布。详细信息见 LICENSE 文件。