最近在項目上利用Tp5開發數據統計的時候碰到了很棘手的問題,數據量太大(上億數據)的時候可能執行的速率有些慢,加了緩存,阿里雲日志…… 雖然效率得到了提高,但是在加載頁面的時候總有有一個時間長短不一的等待過程,這個過程可謂是讓人最難受,因為等待頁面數據刷新出來浪費時間,所以采用了定時任務去跑。
通俗來講:我采用的方法是Tp5寫好定時任務,然后linux-crontab做任務規划,每十分鍾執行一次任務,將數據10分鍾更新一次並存入Redis緩存中,10分鍾后執行的時候就是覆蓋更新數據的過程。這樣在頁面展示的時候直接讀取redis中已經存儲的數據進行展示就好了。免得再去查詢數據庫。
采用thinkphp5的command工具和服務器的定時任務來做:
1.在/application/command(如果沒有這個文件夾那就新建一個)文件夾中創建要配置的PHP類文件,需要繼承Command類,並重寫configure和execute兩個方法,例如:
/application/command/Test.php
一定要記得extends繼承Command
<?php namespace app\admin\command; use think\console\Command; use think\console\Input; use think\console\Output; class Test extends Command {
//配置定時器的信息 protected function configure(){ $this->setName('Test')->setDescription("計划任務Test");
}
protected function execute(Input $input, Output $output){
//輸出到日志 $output->writeln('Date Crontab job start...'); /*** 這里寫計划任務列表集 START ***/ $this->testWork();
//或者直接寫你的代碼邏輯,建議封裝或者調用方法,在其它方法寫好直接調用,簡潔干凈 /*** 這里寫計划任務列表集 END ***/ $output->writeln('Date Crontab job end...'); } private function testWork(){ echo "定時任務testWork"; } }
其中:configure函數是在命令行中用list命令列出所有任務的時候回顯示的出的提示,execute函數是說要執行的命令,在這里可以直接調用其他函數,完成例如統計等任務工作,然后用output輸出到命令行
configure中的$this->setName(" ")是定義你定時任務的名字。
2.配置/application/command.php(沒有自己添加)內容,加入上述的定時器文件
<?php return [ 'app\command\Test' //加入需要cmd或者linux-crontab執行的PHP文件
];
其中return是個數組,所以你可以存放多個任務文件
3.運行test命令
下面開始說一下在Windows中和Linux中分別執行的方法。
Windows(測試):
方法一:
進入到你的TP5項目根目錄,cd C:\phpstudy\PHPTutorial\WWW\work\project 當中,執行:
php think Test
運行php think Test命令test命令execute方法中運行的方法就會運行
沒有報錯的話,就會輸出在excute中執行代碼前后$output輸出的內容
方法二:
寫一個.bat腳本文件:tast.bat文件
C: cd C:\phpstudy\PHPTutorial\WWW\work\project php think Test
點擊文件自動執行。不過感覺方法二沒什么必要,哈哈。
如果要在Windows中寫定時的話,請自行百度,可以實現。但是這邊在Window只做一個測試,看看我們TP5-command定時任務能否順利執行。然后再Linux中進行crontab規划任務
Linux:
將項目上線后,進入到項目根目錄
php think查詢可以被執行的命令,如下:
php think Test
看看能否跑通。沒問題繼續。
接下來再Linux中設定crontab任務
有兩種方式,效果是一樣的:
1.連接到服務器,輸入 crontab -e,寫入:
0 0 * * * php /home/www/pre/app_api/php/sdk/think Test > /dev/null 2>&1
其中紅色 think 不是目錄,相當於我們在Windows中 php think Test 一樣。
這個根據window和Linux系統不一樣,定時任務設置方法也不同,可以自行百度,我用的是本地的windows服務,詳情看百度經驗:Windows計划任務設置,定時執行指定腳本
有問題可以私信me,要大膽去嘗試哈。