Linux && Windows下基於ThinkPHP5框架實現定時任務(TP5定時任務)-結合Crontab任務


最近在項目上利用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 一樣。

注意:1).0 0 * * * 是crontab的定時表達式,表示每天的0點0分執行該文件,具體詳情可以訪問 《crontab定時寫法》進行學習。
         2).可以使用crontab -l 的命令查看已登錄的賬戶有幾個定時器。
         3).可以到 /var/log/cron 文件查看日志文件,便於追蹤錯誤。
還有一種方法就是寫sh腳本執行,但是個人認為用不着寫sh腳本
 
 
這個根據window和Linux系統不一樣,定時任務設置方法也不同,可以自行百度,我用的是本地的windows服務,詳情看百度經驗:Windows計划任務設置,定時執行指定腳本

有問題
可以私信me,要大膽去嘗試哈。


免責聲明!

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



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