大家好,我是小蝸牛,今天給大家分享一下,如何用Thinkphp5.1.*版本實現定時任務,
例如凌晨12點更新數據、每隔10秒檢測過期會員、每隔幾分鐘發送請求保證ip的活性等
本次分享,主要用到一個名為EasyTask的擴展。
那么什么是EasyTask呢?又怎么安裝呢?
什么是EasyTask
EasyTask是一款簡單易用的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 appcommoncommand;
use thinkconsoleCommand;
use thinkconsoleInput;
use thinkconsoleinputArgument;
use thinkconsoleOutput;
use appapiutilsNews;
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 EasyTaskTask();
// 設置記錄運行時目錄(日志或緩存目錄)
$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 [
'appcommoncommandTask',
];
4、配置完成,接下來就是啟動定時任務,讓其常駐于內存(回到根目錄運行)
// php think 定時任務名 動作
啟動任務: php think task start
查詢任務: php think task status
普通關閉: php think task stop
強制關閉: php think task stop force
Ps:由于我使用的是寶塔,會自動禁用某些關鍵函數,根據寶塔提示的禁用函數一個個解封即可。
提示pcntl_fork,解封它
刪除寶塔面板中的禁用函數即可。
寶塔面板,刪除禁用函數
5、運行結果圖
運行成功
運行效果:
從啟動腳本的時間開始,每個6小時,自動運行指定目錄下的類中方法(通過靜態方法調用),這里的方法可以自定義邏輯,主要是如何設定讓它隔一段時間自動運行。
總結
因為第一次使用定時任務,所以采用的是EasyTask這個包,實現定時任務還有很多的解決方案,這里只是給大家提供一個我所使用過的定時任務解決方案。
謝謝大家的閱讀,我是小蝸牛,如果覺得對你有幫助
麻煩請點個贊,點個關注吧~Thanks?(?ω?)?