shabbyrobe / phonycron
PHP cron
Requires
- php: >=5.3.0
Requires (Dev)
- phpunit/phpunit: 4.*
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.php
和 script2.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
文件。