[筆記] 在命令列執行Laravel 的程式

在終端機terminal中執行自行編寫的laravel程式。

以前在寫CI的時候,有時候有些程式是為了排程寫的,在crontab中大概會長這樣

0 17 * * * /usr/bin/php /var/www/html/ci_web/index.php controllerName/functionName > /dev/null 2>&1

透過CI專案中的index.php來執行想執行的程式,但是到了laravel,這個方法就不行了。在看過laravel的文件和一番摸索後,才稍微知道了laravel 的artisan命令列的用法(我一直覺得LARAVEL的文件看起來像天書,明明寫了很多都我看起來大部分都一知半解)。

作法大約如下:

首先透過artisan產生一個command檔,作法就跟產生controller一樣。

php artisan make:command commandName

此時在 /app/Console/Commands 中就會產生一個  commandName.php 的檔案,內容為

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;

class commandName extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'command:name';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Command description';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        //
    }
}

最開頭的 protected $signature = 'command:name';

是替你的命令命名,在此例中,如果維持這樣,那麼只要在專案下執行

php artisan command:name

就會執行這隻程式,冒號的用意在於可以把同類型的命令整理在一起,透過 php artisan list 列出所有命令時會將有同樣開頭的命令整理在一起。

PS.這邊命令名稱可以跟檔名完全無關,要取名成 protected $signature = 'give:money'; 有沒關係,甚至沒有冒號也沒關係

第二段的protected $description = 'Command description'; 則是功能說明,會在 php artisan list 列出。

而最後的 handle() 則是程式主體,將希望執行的命令寫在此處即可,編寫完成後打開

app/Console/Kernel.php

然後加入內容

    protected $commands = [
        //
        Commands\commandName::class
    ];

這樣子此命令就可以使用了。crontab設定方式如下

3 0 * * * /usr/bin/php /var/www/html/laravel_site/artisan command:name  > /dev/null 2>&1

更多的說明可以參考laravel文件,例如傳入參數(執行排程時有時候需要不同的判斷),呼叫另外一隻command,等功能