token27 / cakephp-scheduled-plugin
CakePHP 的定时插件。
Requires
- php: >=7.2
- cakephp/cakephp: ~4.2.0
- lavary/crunz: ~2.2
Requires (Dev)
- phpunit/phpunit: ^8.0
README
CakePHP 4.x 的 Cron 定时插件
目录
介绍
Scheduled 允许您直接从 PHP 文件中编写 cron 任务。它适用于 CakePHP Shell 以及任何其他有效的 PHP 代码。基本上它是一个传统 crontab 文件的替代品。
为什么使用它
传统编写 cron 任务的常规方法是每次需要安排一个任务时,在 crontab 文件中放置一个条目。这种方法的缺点是您每次都必须登录(SSH)到服务器。
通过使用 Scheduled,我们能够将 cron 任务放置在源代码控制系统中,就像其他任何 PHP 代码一样部署到生产环境中。
安装
-
要安装 Scheduled 插件,您可以使用 composer。从您的应用程序根目录(composer.json 文件所在的位置)运行以下命令
composer require token27/cakephp-scheduled-plugin
-
通过以下命令加载插件
path-to-project/bin/cake plugin load Scheduled
-
或者,您可以在应用程序的文件中添加以下行:
path-to-project/config/bootstrap.php
Plugin::load('Scheduled');
启动定时任务
我们只需要安装一个每分钟运行一次的普通 cron 任务。这个 cron 任务将使 Scheduled 能够安排所有后续的任务
* * * * * /path-to-project/bin/cake Scheduled run
定义计划
计划基本上是一个以 Scheduled 为前缀并以 Task.php 结尾的 PHP 文件,它必须返回 Scheduled 对象。所有计划都应该放在一个名为 ScheduledTasks 的文件夹中。这个文件夹必须位于 composer.json 文件所在的根目录。
例如
// path-to-project/src/ScheduledTasks/ScheduledBackupTask.php use Scheduled\Scheduled\Scheduled; $schedule = new \Scheduled\Scheduled\Scheduled(); $scheduled ->run('/usr/bin/php backup.php') ->daily() ->description('Test'); // IMPORTANT: You must return the scheduled object return $scheduled;
安排 CakePHP Shell
要安排一个 CakePHP Shell,调用 Scheduled::shell
$scheduled->shell('MyCake awesome')
安排任何其他命令
要安排任何其他命令,调用 Scheduled::run
$scheduled->run('/usr/bin/php backup.php')
频率选项
有许多定义执行频率的方法
在内部,Scheduled 使用了优秀的 lavary/crunz 库。它提供了大量的选项来配置执行频率。如果您想了解更多可用的频率,请查看其官方文档。
任务运行前
要在任务执行前执行某些操作,我们可以使用 before() 钩子
例如
use Scheduled\Scheduled\Scheduled; $schedule = new \Scheduled\Scheduled\Scheduled(); $scheduled ->run('/usr/bin/php backup.php') ->before(function() { // Do something before the job runs }) ->daily() ->description('Test'); // IMPORTANT: You must return the scheduled object return $scheduled;
任务完成后
要在任务执行后执行某些操作,我们可以使用 after() 钩子
例如
use Scheduled\Scheduled\Scheduled; $schedule = new \Scheduled\Scheduled\Scheduled(); $scheduled ->run('/usr/bin/php backup.php') ->after(function() { // Do something after the job is finished }) ->daily() ->description('Test'); // IMPORTANT: You must return the scheduled object return $scheduled;