前記
laravel實現定時器功能有兩種方法:
1. 使用
command
。
2. 在閉包函數內寫實現的方法。
在這里我比較推薦第一種方法,因為第一種方法把具體的實現抽離出來了,看起來簡單且富有邏輯。
這里給出官方文檔的地址,本文中的大部分內容都參照官方文檔。雖然是英文版的,但小伙伴們要習慣看啊,真的,英文文檔看多了也就沒什么的了。
官方文檔鏈接:https://laravel.com/docs/5.6/scheduling
利用command實現定時器功能:
1. 首先你要利用laravel new xxx(項目名)新建一個項目,並找到Kernel.php,具體的路徑看下面的截圖:
2. 接着我們看Kernel.php中的內容
這邊有個問題需要注意下:時間不能設置為("24:00"),系統會報錯。
3. 接着我們command的具體實現:
4. 在cron中設置定時觸發。
crontab -l 展示crontab 中的數據、crontab -e修改crontab中的數據
前面三步很好做,很簡單。在第4步有一個坑。
坑坑坑:時區問題。
cron是什么?cron服務器可以根據配置文件約定的時間來執行特定的作務。也就是說,你需要在cron的配置文件里告訴cron,在什么時間,以什么樣的頻率,執行什么樣的指令。
比如:* * * * * /usr/bin/php /home/vagrant/HappySleep/artisan schedule:run 這個指令。
* * * * *的意思就是每分鍾執行一次。這個執行一次執行的是schedule代碼。這個時候你可能會想,這玩意兒和everyMinute有什么關系呢?
它們的關系就是你一分鍾執行一次schedule,然后schedule一分鍾執行一次everyMinute的命令行。
那如果沒有schedule:run,只有everyMinute會出現什么情況呢?
schedule不執行,everyMinute自然也不會執行。
那如果schedule:run是5分鍾執行1次,everyMinute執行頻率是怎樣的呢?
我猜測哈:everyMinute應該是5分鍾執行1次,因為只有調用schedule:run的時候它才會被執行。
這個有待驗證,會盡快驗證一下的。
那schedule:run 和 everyMinute的時間頻率是怎樣的呢?
有待驗證!
/usr/bin/php /home/vagrant/HappySleep/artisan schedule:run 是具體的命令。
它由三部分組成:/usr/bin/php、/home/vagrant/HappySleep/artisan、schedule:run。
其實可以縮減為php artisan schedule:run
是不是很熟悉?對了,就是php命令。
只不過我們擔心cron找不到php這個指令控制器的位置,就使用/usr/bin/php告訴cron它的位置。
擔心cron找不到是哪個文件,就告訴cron是/home/vagrant/HappySleep這個文件。然后執行artisan。
后面的schedule:run意思是,執行里面的schedule命令。
指令講完之后就給大家講講坑的問題:laravel默認的有一個時區,而你的服務器或者自己的電腦也有一個時區,兩個時區不一樣,時間就不同步,時間不同步,你的命令雖然會被調用,但是不是在你設置的時間調用,導致你認為自己的程序出了問題。所以要確定項目時區和服務器時區是不是在同一時區。
在laravel項目里的下圖的app.php文件內,修改'timezone' => 'PRC',意思是修改項目內的時區為中國時區。
在你的服務器中利用tzselect,修改自己服務器的時區。具體教程看這個:
https://www.cnblogs.com/Jim-william/p/6873823.html 寫的非常棒!!!感謝。
退出方案:
ctrl+X
到這里這篇博客就結束了!靜以修身,儉以養德。出現問題不可怕,要冷靜思考為什么會出現問題,然后找到方法去解決。