iT邦幫忙

2021 iThome 鐵人賽

DAY 21
0
Modern Web

每日1%,你會累趴。系列 第 21

Day21 Laravel - command & schedule

  • 分享至 

  • xImage
  •  

有些事情是每天都固定會做的事情,譬如每個平日早上都要看一下美股有沒有崩盤才有機會財富重新分配一下,每天下午一點半台股收盤時又賺了幾個便當錢,這種每天都要做但流程很繁瑣的就非常適用於今天的介紹:command

先前在介紹artisan時有提到將這些繁瑣的事情作成一個command這樣只要一鍵輸入即可獲得服務,但想要獲得股票收盤價這種服務還是需要更多的技術性的,所以還是先從基礎介紹起,先來試試看以一鍵可以在留言板sayHello為目標來當第一個command範例吧

php artisan make:command sayHello

接著就可以在app/Console/Commands/下面找到sayHello.php檔案,裡面有兩個屬性及一個功能要特別介紹

  1. signature
    因為這是一個自定義的artisan指令,所以想要用artisan來觸發就必須給這個功能一個專屬的名字,因為目標是在留言板sayHello,所以就設定為sayHello,之後要觸發這個指令就只要下php artisan sayHello即可
  2. description
    當只用php artisan list時可以看到每個指令都有自己的介紹,就是利用這個屬性來描述該指令的用處,那就將它設定為Say hello to every by message board
  3. handle
    這個function就是要處理指令被觸發時所要執行的內容,因為目標是要在留言板say hello,所以會在最上方引入Message的Model use App\Models\Message;,然後在handle內實現功能
Message::create([
    'member' => 'admin',
    'message' => 'Hello everyone',
]);

完成後可以使用php artisan list來確認是不是已經有這個功能了
https://ithelp.ithome.com.tw/upload/images/20210921/20115048kPzTvGs1ZX.png

之後就可以使用指令來測試看看功能是否正常

php artisan sayHello

https://ithelp.ithome.com.tw/upload/images/20210921/20115048CUazHnPKpv.png

妥妥的沒有問題。

另外一個小撇步可以在signature屬性使用冒號來做群組分類,例如都是在處理留言板的command就在前面加上一個message:做前綴,這樣command越寫越多時會比較容易分類,新增一個sayHi來當範例

php artisan make:command sayHi

將sayHello的signature改為message:sayHello
sayHi的signature改為message:sayHi

此時再使用php artisan list就可以看到這兩個指令已經被歸類在一起了
https://ithelp.ithome.com.tw/upload/images/20210921/201150480HNT6xvXVT.png


既然都有了一鍵執行的方法,能不能再更懶惰一點,讓系統自己定時執行就好,連打指令都可以省下了,那就需要搭配schedule的功能了。

/app/Console/之下可以找到一個Kernel.php的檔案將它打開,今天的目標先專注在schedule這個function就好,先將今天的command已一分鐘sayHello一次、五分鐘sayHi一次的頻率寫好。

$schedule->command('message:sayHello')->everyMinute();
$schedule->command('message:sayHi')->everyFiveMinutes();

接著來介紹一下schedule的四大指令

schedule:list
schedule:run
schedule:test
schedule:work
  1. schedule:list
    顧名思義可以將所有自己設定的scheduls列表出來,並且可以得知下次的執行時間為何
  2. schedule:run
    將設定好的schedule執行單次,有點像測試執行結果的概念
  3. schedule:test
    檢查schedule是否有編譯上的錯誤,並不會真的運行
  4. schedule:work
    開始運行所有的schedule,但此時terminal會被佔用著,當然也有不佔用terminal的作法,這就會需要用到作業系統本身的crontab,今天先暫且不談

此時下完schedule:work後等待五分鐘就可以確認一下功能是否正常了

https://ithelp.ithome.com.tw/upload/images/20210921/20115048Hnx4pMbqqJ.png

確認每分鐘都會有一個Hello並於每五分鐘為單位會出現一次Hi,今天的任務就算成功了,另外要提到的是我在建立sayHi這個schedule時因為沒有在上方引入Message的Model所以一直不會有sayHi的訊息寫入資料庫,讓我找問題找了蠻久,最後是在storage/logs裡的log紀錄找到原因,由此可知schedule在運行時有些錯誤是會被直接忽略的這點要特別注意一下。

排程能做的事情無窮無盡,就像這30天的文章也是利用排程自動上傳的,今天的介紹就到這邊結束了,謝謝觀看的各位,請記得按讚分享開啟小鈴鐺,你的支持會讓按讚數+1。


上一篇
Day20 Laravel - test
下一篇
Day22 AWS - SignUp & MFA
系列文
每日1%,你會累趴。30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言