Laravel 學習筆記:Command

Nomandia88發表於2020-12-24

Laravel 開發console程式非常方便,其模式與其他框架,如yii類似。本文參考了 Laravel 5.5 文件 詳細資訊請參考之。注:本文是基於Laravel 5.5的版本編寫請注意。

一、crontab 瞭解

Cron 是Linux下的定時器工具,可以方便執行定時任務。其格式大致如:

Cron命令格式

注:簡單的記成:分、時、日、月、周,萬用字元*配合位置表示任意值(如每分鐘、每小時等)

1. cron相關命令

# 顯示一個cron列表,其內容是由當前使用者啟動的任務
crontab -l

# 編輯自己的cron列表
crontab -e

2. 簡單的栗子

* * * * * /path/php artisan myCommand             # 每分鐘執行
*/1 * * * * /path/php artisan myCommand           # 每分鐘執行,同上

*/5 * * * * /path/php artisan myCommand           # 每5分鐘執行

10,20 * * * * /path/php artisan myCommand         # 每小時10分、20分時執行

1-31,35 * * * * /path/php artisan myCommand       # 每小時1至31分、35分執行

0 */2 * * 0 /path/php artisan myCommand param1 param2 # 複雜點的例子,你能看懂嗎?

生成環境下需要加上 &> /dev/null

* * * * * /path/php artisan myCommand &> /dev/null

這樣做會直接丟棄cron任務的console輸出,可以減少系統資源開銷

3.複雜點的栗子

有時候我們覺得每分鐘執行一次間距太大了,我想改成每20秒中執行,那該怎麼寫?

# 請參考這個栗子
* * * * * /path/php artisan myCommand    
* * * * * sleep 20 ; /path/php artisan myCommand
* * * * * sleep 40 ; /path/php artisan myCommand
#看到這裡你應該秒懂了,其實就是延時20秒啟動一次即可

二、Laravel 控制檯

這裡假裝你已經熟悉(起碼得了解)artisan的使用,比如:

# 列出可用的命令
php artisan list
  1. 通過laravel提供的基礎命令來生成一個Command,如:

    php artisan make:command MyCommand
  2. 命令執行成功後會生成 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](https://learnku.com/users/31554) void
 */
public function __construct()
{
    parent::__construct();
}

/**
 * Execute the console command.
 *
 * [@return](https://learnku.com/users/31554) mixed
 */
public function handle()
{
    // 入口方法
    $param1 = $this->argument('param1'); // 不指定引數名的情況下用argument
    $param2 = $this->option('param2'); // 用--開頭指定引數名
    echo "你的引數是:{$param1}, {$param2}";
}

}


3. 開啟 App\Console\Kernel.php
```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框架有一段時間了,這裡記錄下每一天的成長,希望與大家共勉。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章