大家好,我是小蝸牛,今天給大家分享一下,如何用ThinkPHP5.1.*版本實現定時任務,
例如凌晨12點更新資料、每隔10秒檢測過期會員、每隔幾分鐘傳送請求保證ip的活性等
本次分享,主要用到一個名為EasyTask的擴充套件。
那麼什麼是EasyTask呢?又怎麼安裝呢?
什麼是EasyTaskEasyTask是一款簡單易用的PHP常駐記憶體定時器,可以用它來完成重複執行的任務(如訂單超時自動取消,簡訊郵件非同步推送,佇列/消費者/頻道訂閱者等等),甚至處理Crontab計劃任務(如每天凌晨1點-3點同步DB資料,每月1號生成月度統一報表,每晚10點重啟nginx伺服器等等),工具包同時支援windows、linux、mac環境執行。與之相似的還有Workman等工具。
這裡是EasyTask的官方文件地址:https://gitee.com/392223903/EasyTask
如何安裝EasyTask(這裡以Thinkphp框架為例)首先進入你的thinkphp目錄下,使用composer進行安裝,使用如下指令:
composer require easy-task/easy-tas
如何使用EasyTask關於如何使用EasyTask這個元件,需要配合thinkphp中的建立自定義指令功能。
當你安裝好EasyTask後(這裡預設你已經安裝好,如果安裝過程中出現問題,請根據程式碼提示搜尋解決方案)
1、在thinkphp框架中建立一個自定義命令類檔案,這裡我新增的是一個名為Task.php的檔案,路徑是:application/common/command/Task.php
2、Task.php中的程式碼:
<?php
namespace app\\common\\command;
use think\\console\\Command;
use think\\console\\Input;
use think\\console\\input\\Argument;
use think\\console\\Output;
use app\\api\\\\utils\\News;
class Task extends Command
{
// 配置
protected function configure()
{
//設定名稱為task
$this->setName('task')
//增加一個命令引數,用於獲取輸入操控引數
->addArgument('action', Argument::OPTIONAL, "action")
->addArgument('force', Argument::OPTIONAL, "force");
}
// 執行邏輯
protected function execute(Input $input, Output $output)
{
//獲取輸入引數
$action = trim($input->getArgument('action'));
$force = trim($input->getArgument('force'));
// 配置任務
// 建立EasyTask物件
$task = new \\EasyTask\\Task();
// 設定記錄執行時目錄(日誌或快取目錄)
$task->setRunTimePath('./runtime/viplog/');
// 設定常駐記憶體
$task->setDaemon(true);
// 新增類的方法型別定時任務(同時支援靜態方法)(開啟1個程序,每隔10秒執行1次)
// 這裡我設定每6小時執行一下News類中的upNews方法。
$task->addClass(News::class, 'upNews','upnews' ,21600, 1);
// 根據命令執行
if ($action == 'start')
{
$task->start();
}
elseif ($action == 'status')
{
$task->status();
}
elseif ($action == 'stop')
{
$force = ($force == 'force'); //是否強制停止
$task->stop($force);
}
else
{
exit('Command is not exist');
}
}
}
3、配置application/command.php檔案
<?php
return [
'app\\common\\command\\Task',
];
4、配置完成,接下來就是啟動定時任務,讓其常駐於記憶體(回到根目錄執行)
// php think 定時任務名 動作
啟動任務: php think task start
查詢任務: php think task status
普通關閉: php think task stop
強制關閉: php think task stop force
Ps:由於我使用的是寶塔,會自動禁用某些關鍵函式,根據寶塔提示的禁用函式一個個解封即可。
寶塔面板,刪除禁用函式
5、執行結果圖
執行效果:
從啟動指令碼的時間開始,每個6小時,自動執行指定目錄下的類中方法(通過靜態方法呼叫),這裡的方法可以自定義邏輯,主要是如何設定讓它隔一段時間自動執行。
總結因為第一次使用定時任務,所以採用的是EasyTask這個包,實現定時任務還有很多的解決方案,這裡只是給大家提供一個我所使用過的定時任務解決方案。