# laravel Scheduled 排程 https://ithelp.ithome.com.tw/articles/10192485 重要 https://www.youtube.com/watch?v=r-KrsQ0dN80 https://laracasts.com/series/intermediate-laravel/episodes/2 https://laravel.tw/docs/5.2/scheduling ## 介紹 Scheduled Jobs 適合做一些沒人管的事。清理數據庫中的陳舊記錄,為訂閱它們的人做每週摘要,等等。如果在特定時刻(或時間間隔)有事情要做,而不依賴於時間以外的任何事情被解僱,並且可能是真值條件,您應該使用計劃作業。 要小心同一時間執行同一命令 上一個還未完成 https://pandalab.org/articles/106 https://www.youtube.com/watch?v=_NoWp58pHa4&t=856s&ab_channel=Laratips ## 避免重複 ![](https://i.imgur.com/CmX6UYf.png) ## 安排事情 您可以安排在許多不同的結構中每天/每小時運行一次。 你可以調度一個 artisan 命令、一個 Job 類、一個可調用的類、一個回調函數,甚至執行一個 shell 腳本。 ``` use App\Jobs\Heartbeat; $schedule->job(new Heartbeat)->everyFiveMinutes(); ``` `$schedule->exec('node /home/forge/script.js')->daily();` ``` use App\Console\Commands\SendEmailsCommand; $schedule->command('emails:send Taylor --force')->daily(); $schedule->command(SendEmailsCommand::class, ['Taylor', '--force'])->daily(); ``` ``` protected function schedule(Schedule $schedule) { $schedule->call(function () { DB::table('recent_users')->delete(); })->daily(); } ``` ## * * * * * php /path/to/artisan schedule:run 1>> /dev/null 2>&1 這段是要在讓作業系統執行 所以可直接跑 php aritnsa schedule:run去執行 mac跟 Linex的話 可以看網路很多(哥不林也有講到) windos的話用 建立一個.bat檔案 裡面寫上 ``` cd laravel-projects\testLaravel D:\php\xampp\php\php.exe artisan schedule:run 1>> NUL 2>&1 ``` 自己執行就好 如果要UI的 最少要五分鐘(同事說的) 這樣直接手點比較快 用來測試的話 ## 原理 ![](https://i.imgur.com/uyOzbWC.png) 你可以看到 他是把每個命令都跑exec給作業系統用 然後你看它會自動跑 php artisna 這樣 schedule不是真的even All of the events on the schedule. 他是schedule的event不是那個事件event 他會去註冊contanier ![](https://i.imgur.com/E0GCuwT.png) 你看在vender那邊有用 所以他是一個ioc的概念 然後去看註冊的容器 看fire function 你看都會跑 foreach 所以他上一句重點 他會跑dueEvents 裡面會跑 is->Due() ## 自己看法 她寫在kennel裡面 然後可以看exec funtion 在官網有說是對作業系統 然後你看他會new EVEN 這個class裡面寫一些排成的事情 ex你看它裡面 的trait ManagesFrequencies 裡面有時間 every之類的然後會去呼叫day之類的function 裡面會在定義const 如果是分鐘之類的 ``` public function everyFiveMinutes() { return $this->spliceIntoPosition(1, '*/5'); } ``` **重點** 實現的原理是用cron 你可以看到排成裡面都用->cron 這是artisna cli裡面會說到 調度 Artisan 命令 開發人員會為他們希望調度的每個控制台命令生成一個 Cron 條目。然而,這是一個令人頭疼的問題。您的控制台計劃不再受源代碼控制,您必須通過 SSH 連接到您的服務器才能添加 Cron 條目。讓我們的生活更輕鬆。Laravel 命令調度器允許您在 Laravel 本身內流暢而富有表現力地定義您的命令調度,並且您的服務器上只需要一個 Cron 條目。 **星號的意思** 5個星號*分別代表分鐘、小時、天、月、星期。 分鐘:0-59的整數,預設星號和星號/1 代表1分鐘。 小時:0-23的整數。 天:1-31的整數。 月:1-12的整數。 星期:0-7的整數,0和7都代表星期日。 ## exec vs command exec是在作業系統上執行的 $schedule->exec('php artisna make:migration') 等於 commeand的 $schedule->command(' make:migration') ## 底層原理 在vender的laravel/src裡面的console裡面有schedule裡面有schedule的provider ## 實作 ``` protected function schedule(Schedule $schedule) { // $schedule->command('banner:valid')->everyMinute(); $schedule->command('daily-statistics:post-like')->daily(); //日累積成就-按讚 $schedule->command('monthly-statistics:post-like')->monthlyOn(1, '06:00'); //月累積成就-按讚 $schedule->command('telescope:prune --hours=12')->daily(); //清除較舊紀錄 $schedule->command('daily-statistics:most-hit-fan-club')->daily(); //計算人氣排行分類底下各個fan-club近14天的粉絲增長數量 $schedule->command('daily-statistics:newest-fan-club')->daily(); //排序最新fan-club分類底下的各個fan-club } ``` 可以在kennel寫 然後command的話 可以自己寫 ## 呼叫class 進階一點呼叫comment的class 也能給參數 ![](https://i.imgur.com/UgF02Jj.png) ###### tags: `Laravel`