Laravel5 (cli)命令行執行腳本及定時任務


Artisan是Laravel自帶的命令行接口名稱,它提供了很多有用的命令想要查看所有可用的Artisan命令,可使用list命令查看:

1
php artisan list

每個命令都可以用help指令顯示命令描述及命令參數和選項。想要查看幫助界面,只需要在命令前加上help就可以了,例如:

1
php artisan help migrate

除了Artisan提供的命令之外,還可以構建自己的命令。可以將自定義命令存放在app/Console/Commands目錄;當然,也可以自己選擇存放位置,只要改命令可以基於composer.json被自動加載。

要創建一個新命令,可以使用Artisan命令make:console,比如我要創一個發送郵件的artisan命令,可以這樣:

1
php artisan  make :console SendEmails

上述命令將會生成一個類app/Console/Commands/SendEmails.php,當創建命令時,--command選項可用於分配終端命令名(在終端調用命令時用):

1
php artisan  make :console SendEmails -- command =emails:send

命令生成以后,需要填寫該類的signaturedescription屬性,這兩個屬性在調用list顯示命令的時候會被用到。handle方法在命令執行時被調用,可以將所有命令邏輯都放在這個方法里面,我們可以在命令控制器的構造函數中注入任何依賴.這個SendEmails.php里面內容參考如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?php  namespace  App\Console\Commands;
 
use  Illuminate\Console\Command;
 
class  SendEmails  extends  Command {
 
     /**
      * The console command name.
      *
      * @var string
      */
     protected  $name  'emails:send' ;
 
     /**
      * The console command description.
      *
      * @var string
      */
     protected  $description  '這是發郵件的命令.' ;
 
     /**
      * Create a new command instance.
      *
      * @return void
      */
     public  function  __construct()
     {
         parent::__construct();
     }
 
     /**
      * Execute the console command.
      *
      * @return mixed
      */
     public  function  handle()
     {
         //TODO:發送郵件邏輯
     }
 

$name是這個命令的名稱,即artisan調用時的命令,如本例命令設為了emails:send,那么實際調用時要這么用:

1
php artisan emails:send

執行上面這條命令就是執行handle()方法,當然,這里還漏了一個非常重要的關鍵步驟,那就是需要把命令注入到app/Console/Kernel.php文件中,否則這個命令artisan是找不到的,示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php  namespace  App\Console;
 
use  Illuminate\Console\Scheduling\Schedule;
use  Illuminate\Foundation\Console\Kernel  as  ConsoleKernel;
 
class  Kernel  extends  ConsoleKernel {
 
     /**
      * The Artisan commands provided by your application.
      *
      * @var array
      */
     protected  $commands  = [
         'App\Console\Commands\Inspire' ,
         'App\Console\Commands\SendEmails' ,
     ];
 
     /**
      * Define the application's command schedule.
      *
      * @param  \Illuminate\Console\Scheduling\Schedule  $schedule
      * @return void
      */
     protected  function  schedule(Schedule  $schedule )
     {
         $schedule ->command( 'inspire' )
                  ->hourly();
     }
 
}

關鍵就是在$commands里面把要用到的SendEmails類放進去,好了,這樣就可以通過artisan命令來執行腳本了.

由於artisan命令需要在Laravel的目錄里面才能執行,所以實際要用crontab調用artisan命令時需要注意Crontab的shell代碼要這樣寫,切記非常重要,否則是執行了不會運行實際處理邏輯的.

1
30 1 * * *    php  /www/projects/laravelapp/artisan  emails:send

上面/www/projects/laravelapp/是項目的路徑


定時任務:

 

Laravel有內置命令調度器,可以方便的實現Cron.

任務調度定義在app/Console/Kernel.php文件的schedule方法中,該方法已經包含了一個示例.Laravel里有兩種方法執行Cron,第一種方法是讓Cron每分鍾調用Laravel命令調度,然后讓Laravel來根據具體的命令來實現;需要在crontab里面加入如下內容:

1
* * * * * php  /path/to/artisan  schedule:run 1>>  /dev/null  2>&1

然后在上面的Kernel.php的schedule中添加任務


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM