Laravel 学习笔记:Command

发布时间:2021-07-24 14:22:29 阅读:1516次

https://www.jianshu.com/p/99baaffcec18

https://www.cnblogs.com/aipiaoborensheng/p/9308850.html

前提:本文方法是利用Linux的crontab定时任务来协助实现Laravel调度(Mac也一样)。 
一、首先添加Crontab定时任务,这里只做简单介绍。 
用命令crontab -e 添加如下内容

* * * * * /usr/local/bin/php /usr/local/var/www/projectName/artisan schedule:run >> /dev/null 2>&1 
  • 1
  • 2

如图: 
这里写图片描述
上面命令Crontab会每分钟去调Laravel的schedule命令,然后Laravel判断执行任务。 
注意:要注意php和artisan的目录,which php可以查看php目录 
***** 你的命令 
另外上面的命令前面的5个*分别代表分钟、小时、天、月、星期。 
分钟:0-59的整数,默认*和*/1 代表1分钟。 
小时:0-23的整数。 
天:1-31的整数。 
月:1-12的整数。 
星期:0-7的整数,0和7都代表星期日。 
crontab -l 可以列出当前的定时任务。

二、添加Laravel调度任务。 
1、在App\Console\Kernel类中定义你的调度任务:

<?php

namespace App\Console;

use Illuminate\Console\Scheduling\Schedule;
use Laravel\Lumen\Console\Kernel as ConsoleKernel;
use Log; class Kernel extends ConsoleKernel { /**
     * The Artisan commands provided by your application.
     * 定义Artisan命令
     * @var array
     */ protected $commands = [
                \App\Console\Commands\test::class, ]; /**
     * Define the application's command schedule.
     * 定义调度任务
     * @param  \Illuminate\Console\Scheduling\Schedule  $schedule
     * @return void
     */ protected function schedule(Schedule $schedule)
    { //方法一: //            $schedule->call(function () { //                Log::info('任务调度'); //            })->everyMinute(); //方法二: $schedule->command('test')->everyMinute();
    }
}

上面举例了两种实现方法,方法一是用闭包,方法二是用Artisan命令实现的。 
调度的时间可以有多种: 
->cron(‘* * * * *’); 在自定义Cron调度上运行任务 
->everyMinute(); 每分钟运行一次任务 
->everyFiveMinutes(); 每五分钟运行一次任务 
->everyTenMinutes(); 每十分钟运行一次任务 
->everyThirtyMinutes(); 每三十分钟运行一次任务 
->hourly(); 每小时运行一次任务 
->daily(); 每天凌晨零点运行任务 
->dailyAt(‘13:00’); 每天13:00运行任务 
->twiceDaily(1, 13); 每天1:00 & 13:00运行任务 
->weekly(); 每周运行一次任务 
->monthly(); 每月运行一次任务 
还有一下额外的方法,请参考:http://laravelacademy.org/post/235.html

下面继续方法二的操作: 
三、定义Artisan命令的方法:

<?php namespace App\Console\Commands;

use Illuminate\Console\Command;
use Log; class test extends Command { /**
     * The console command name.
     *
     * @var string
     */ protected $name = 'test:putcache'; /**
     * The console command description.
     *
     * @var string
     */ protected $description = 'test controller'; /**
     * Execute the console command.
     *
     * @return mixed
     */ public function handle()
    { //这里做任务的具体处理,可以用模型 Log::info('任务调度'.time());
    }

}

好了,以上就可以执行定时任务了,有个小技巧如果上面的任务没执行可以用命令php artisan list 可以打印出一些错误信息

https://blog.csdn.net/liukai6/article/details/102613613

->cron('* * * * *'); 在自定义Cron调度上运行任务
->everyMinute(); 每分钟运行一次任务
->everyFiveMinutes(); 每五分钟运行一次任务
->everyTenMinutes(); 每十分钟运行一次任务
->everyFifteenMinutes(); 每十五分钟运行一次任务
->everyThirtyMinutes(); 每三十分钟运行一次任务
->hourly(); 每小时运行一次任务
->hourlyAt(17); 每小时第十七分钟运行一次任务
->daily(); 每天凌晨零点运行任务
->dailyAt('13:00'); 每天13:00运行任务
->twiceDaily(1, 13); 每天1:00 & 13:00运行任务
->weekly(); 每周运行一次任务
->monthly(); 每月运行一次任务
->monthlyOn(4, '15:00'); 每月4号15:00运行一次任务
->quarterly(); 每个季度运行一次
->yearly(); 每年运行一次
->timezone('America/New_York'); 设置时区

$schedule->call(function () {
    // 每周星期一13:00运行一次...
})->weekly()->mondays()->at('13:00');

// 工作日的上午8点到下午5点每小时运行...
$schedule->command('foo')
         ->weekdays()
         ->hourly()
         ->timezone('America/Chicago')
         ->between('8:00', '17:00');
————————————————

https://blog.csdn.net/qvanminpiao/article/details/92588235


这里假装你已经熟悉(起码得了解)artisan的使用,比如:

# 列出可用的命令
php artisan list 
  1. 通过laravel提供的基础命令来生成一个Command,如:
php artisan make:command MyCommand 
  1. 命令执行成功后会生成 app\Console\Commands\MyCommand.php,打开后发现:
<?php namespace App\Console\Commands; use Illuminate\Console\Command; class TestCommand extends Command { /**
     * The name and signature of the console command.
     *
     * @var string
     */ protected $signature = 'GroupName:cmd1 {param1} {--param2=}'; /**
     * The console command description.
     *
     * @var string
     */ protected $description = 'Tell me,im great!'; /**
     * Create a new command instance.
     *
     * @return void
     */ public function __construct() { parent::__construct(); } /**
     * Execute the console command.
     *
     * @return mixed
     */ public function handle() { // 入口方法 $param1 = $this->argument('param1'); // 不指定参数名的情况下用argument $param2 = $this->option('param2'); // 用--开头指定参数名 echo "你的参数是:{$param1}, {$param2}"; } } 
  1. 打开 App\Console\Kernel.php
// ... protected $commands = [ // 加入可用命令列表 Commands\TestCommand::class, ]; // ... protected function schedule(Schedule $schedule) { // 批量执行时需要在这里定义,这里假设为每分钟执行 $schedule->command('GroupName:cmd1')->everyMinute(); } // ... 
  1. 测试
# 查看是否添加了命令
> php artisan list
# ...
 GroupName
  GroupName:cmd1             Tell me,im great!t! # 还不错,这里出现了即代表可用
# ...

# 单命令执行
> php artisan GroupName:cmd1 hello --param2=world
你的参数是:hello, world 

这里你发现了,如果指定$signature时用了:即会给命令分组,如:分组名:命令名。但输入命令式仍然输入完整的名称。

  1. 其他事项

上文中如果你只输入了命令名而省略了参数的话会报错,如:

> artisan GroupName:cmd1

  Not enough arguments (missing: "param1"). 

由于我们定义的参数是必选的,因此会报这个错误。这时如果需要参数是可选的只需做如下调整。

protected $signature = 'GroupName:cmd1 {param1? } {--param2=}'; 

只需要在param1后增加?即可,option参数则不必。另外,我们可以通过相关方法来获取输入的参数表。

在handle中执行$this->arguments()获取参数表,如:

{ "command":"GroupName:cmd1", "param1":"p1" } 

执行$this->options()获取选项表,如:

{ "param2":"p2", "help":false, "quiet":false, "verbose":false, "version":false, "ansi":false, "no-ansi":false, "no-interaction":false, "env":null } 

通过以上的方法可以动态的判定传入的参数,方法内自行处理相应的逻辑。

学习Laravel框架有一段时间了,这里记录下每一天的成长,希望与大家共勉。

如有问题,可以QQ搜索群1028468525加入群聊,欢迎一起研究技术

支付宝 微信

有疑问联系站长,请联系QQ:QQ咨询

转载请注明:Laravel 学习笔记:Command 出自老鄢博客 | 欢迎分享