teddywest32 / yii2-scheduler
Yii2 框架的调度扩展
Requires
- php: >=5.4.0
- mtdowling/cron-expression: ~1.0
- symfony/process: 2.6.*
- yiisoft/yii2: 2.0.*
Suggests
- guzzlehttp/guzzle: Required to use the thenPing method on schedules (~5.0).
This package is not auto-updated.
Last update: 2024-09-20 23:59:59 UTC
README
本扩展是 Laravel 调度组件(https://laravel.net.cn/docs/master/artisan#scheduling-artisan-commands)的移植。
安装
安装此扩展的首选方式是通过 composer。
运行
php composer.phar require omnilight/yii2-scheduling "*"
或添加
"omnilight/yii2-scheduling": "*"
到您的 composer.json 文件的 require
部分。
描述
本项目受 Laravel 调度组件的启发,试图将其简洁性带到 Yii 框架中。以下是 Laravel 文档中的引用:
In the past, developers have generated a Cron entry for each console command they wished to schedule.
However, this is a headache. Your console schedule is no longer in source control,
and you must SSH into your server to add the Cron entries. Let's make our lives easier.
安装后,您只需在 crontab 中添加一行即可。
* * * * * php /path/to/yii yii schedule/run --scheduleFile=@path/to/schedule.php 1>> /dev/null 2>&1
您可以将调度放入 schedule.php
文件中,或在扩展或应用的引导过程中添加。
调度示例
此扩展支持 Laravel 调度所有功能,除了环境和维护模式。
调度闭包
$schedule->call(function() { // Do some task... })->hourly();
调度终端命令
$schedule->exec('composer self-update')->daily();
运行应用命令
$schedule->command('migrate')->cron('* * * * *');
频繁作业
$schedule->command('foo')->everyFiveMinutes(); $schedule->command('foo')->everyTenMinutes(); $schedule->command('foo')->everyThirtyMinutes();
每日作业
$schedule->command('foo')->daily();
每日特定时间(24小时制)作业
$schedule->command('foo')->dailyAt('15:00');
每日两次作业
$schedule->command('foo')->twiceDaily();
每周工作日运行的作业
$schedule->command('foo')->weekdays();
每周作业
$schedule->command('foo')->weekly(); // Schedule weekly job for specific day (0-6) and time... $schedule->command('foo')->weeklyOn(1, '8:00');
每月作业
$schedule->command('foo')->monthly();
在特定日期运行的作业
$schedule->command('foo')->mondays(); $schedule->command('foo')->tuesdays(); $schedule->command('foo')->wednesdays(); $schedule->command('foo')->thursdays(); $schedule->command('foo')->fridays(); $schedule->command('foo')->saturdays(); $schedule->command('foo')->sundays();
仅在回调为真时运行作业
$schedule->command('foo')->monthly()->when(function() { return true; });
将调度作业的输出电子邮件发送给用户
$schedule->command('foo')->sendOutputTo($filePath)->emailOutputTo('foo@example.com');
如何在您的应用中使用此扩展?
您应该在 @console/config/schedule.php
下创建以下文件(注意:您可以在服务器上的任何位置创建具有任何名称、扩展名的文件,只需在下面的命令中调整 scheduleFile 的名称即可)。
<?php /** * @var \omnilight\scheduling\Schedule $schedule */ // Place here all of your cron jobs // This command will execute ls command every five minutes $schedule->exec('ls')->everyFiveMinutes(); // This command will execute migration command of your application every hour $schedule->command('migrate')->hourly(); // This command will call callback function every day at 10:00 $schedule->call(function(\yii\console\Application $app) { // Some code here... })->dailyAt('10:00');
接下来,您应该在 crontab 中添加以下命令:
* * * * * php /path/to/yii yii schedule/run --scheduleFile=@console/config/schedule.php 1>> /dev/null 2>&1
这样就完成了!现在所有 cron 作业都将按照您在 schedule.php 文件中配置的运行。
如何在您的扩展中使用此扩展?
首先,您应该在您的 composer.json 中包含对 omnilight\yii2-scheduling
的依赖。
...
'require': {
"omnilight/yii2-schedule": "*"
}
...
接下来,您应该创建扩展的引导类,如 https://yiiframework.cn/doc-2.0/guide-structure-extensions.html#bootstrapping-classes 中所述。
在引导方法中放置以下代码:
public function bootstrap(Application $app) { if ($app instanceof \yii\console\Application) { if ($app->has('schedule')) { /** @var omnilight\scheduling\Schedule $schedule */ $schedule = $app->get('schedule'); // Place all your shedule command below $schedule->command('my-extension-command')->dailyAt('12:00'); } } }
在扩展的 README 中添加用户注册 schedule
组件以及将 schedule/run
命令添加到 crontab 的信息,如上面所述。
使用 schedule
组件
如果您只在使用调度(并且不想允许扩展注册它们自己的 cron 作业)时使用 schedule
组件,则无需直接使用 schedule
组件或在您的应用中定义它。但如果您想允许扩展注册 cron 作业,则应在应用配置中定义 schedule
组件。
'schedule' => 'omnilight\scheduling\Schedule',
使用附加功能
如果您想使用 Event 的 thenPing
方法,您应该将以下字符串添加到您的应用的 composer.json
中。
"guzzlehttp/guzzle": "~5.0"
关于时区注意事项
请注意,这是一个PHP扩展,因此它使用在php配置或您的Yii配置文件中定义的时区,所以请正确设置它们。