laravel實現定時器功能


前記

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

   到這里這篇博客就結束了!靜以修身,儉以養德。出現問題不可怕,要冷靜思考為什么會出現問題,然后找到方法去解決。


免責聲明!

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



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