Laravel 開發console程式非常方便,其模式與其他框架,如yii類似。本文參考了 Laravel 5.5 文件 詳細資訊請參考之。注:本文是基於Laravel 5.5的版本編寫請注意。
一、crontab 瞭解
Cron 是Linux下的定時器工具,可以方便執行定時任務。其格式大致如:
注:簡單的記成:分、時、日、月、周,萬用字元*配合位置表示任意值(如每分鐘、每小時等)
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
通過laravel提供的基礎命令來生成一個Command,如:
php artisan make:command MyCommand
命令執行成功後會生成 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();
}
// ...
- 測試
# 檢視是否新增了命令 > php artisan list # ... GroupName GroupName:cmd1 Tell me,im great!t! # 還不錯,這裡出現了即代表可用 # ...
php artisan GroupName:cmd1 hello –param2=world
你的引數是:hello, world這裡你發現了,如果指定$signature時用了:即會給命令分組,如:*分組名:命令名*。但輸入命令式仍然輸入完整的名稱。
- 其他事項
上文中如果你只輸入了命令名而省略了引數的話會報錯,如:
> 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 協議》,轉載必須註明作者和本文連結