过去做定时任务,每做一个定时任务,都需要在crontab中增加一个cron入口,很麻烦。
最近看文档中有一个方式可以省却这个步骤,只需要一个cron入口就可以了。
目录
1.创建自定义定时任务
项目根目录下执行
php artisan make:command CronTest
即在console目录下创建定时任务文件
2.修改定时任务文件
数据表:
CREATE TABLE `user_role` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`uid` int(11) NOT NULL COMMENT '用户id',
`api_role_id` int(11) NOT NULL COMMENT '角色id',
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE,
KEY `uid_index` (`uid`) USING BTREE,
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
代码如下:
<?php
namespace App\Console\Command;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
class CronTest extends Command
{
/**
* 写入定时命令
*
* @var string
*/
protected $signature = 'cronTest {type}';
/**
* 命令说明
*
* @var string
*/
protected $description = '测试定时处理';
/**
* 创建新的命令实例
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* 定时任务业务逻辑
*
* @return mixed
*/
public function handle()
{
$type = $this->argument('type');
switch ($type) {
case 1://
$this->info('执行入库');
DB::table('user_role')->insert(['uid' => 1, 'api_role_id' => 1, 'created_at' => date('Y-m-d H:i'), 'updated_at' => date('Y-m-d H:i')]);
break;
}
echo 'success';
die;
}
}
3.修改任务调度内核
<?php
namespace App\Console;
use App\Console\Command\CronTest;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
class Kernel extends ConsoleKernel
{
/**
* 应用中自定义的 Artisan 命令
*
* @var array
*/
protected $commands = [
CronTest::class //注册刚才编写的命令文件类
];
4.使用过去的方式执行命令
执行前
执行命令:
php artisan cronTest 1
执行结果:
这种方式需要在crontab中 定义执行命令的时间的命令文件的路径、参数
5.使用laravel调度器启动定时命令
修改任务调度内核
<?php
namespace App\Console;
use App\Console\Command\CronTest;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
class Kernel extends ConsoleKernel
{
/**
* 应用中自定义的 Artisan 命令
*
* @var array
*/
protected $commands = [
CronTest::class
];
/**
* 定义应用程序的命令计划
*
* @param \Illuminate\Console\Scheduling\Schedule $schedule
* @return void
*/
protected function schedule(Schedule $schedule)
{
// 每分钟执行一次 cronTest 1 命令
$schedule->command('cronTest 1')->everyMinute();
}
/**
* 为应用程序注册命令
*
* @return void
*/
protected function commands()
{
$this->load(__DIR__.'/Commands');
require base_path('routes/console.php');
}
/**
* 多个计划事件默认使用的时区。
*
* @return \DateTimeZone|string|null
*/
protected function scheduleTimezone()
{
return 'Asia/Shanghai';
}
}
执行命令:
php artisan schedule:run
执行结果:
能达到同样效果,最后需要把调度器加入cron中,就可以直接加一次便足够运行所有项目添加的定时任务。
命令如下:
* * * * * cd /path-to-your-project && php artisan schedule:run
6.调度频率设置
7.后台运行命令
默认情况下,计划同时运行的多个命令将会顺序执行。若你有长时间运行的命令,这可能导致后续命令的启动时间比预期的更晚。
可以使用 runInBackground 方法让命令在后台运行,这样可以同时运行多个命令。
$schedule->command('cronTest 1')->everyMinute()->runInBackground();