Hyperf定時任務

Hyperf初體驗 定時任務

項目開發難免會用到定時任務去執行一些簡單的操作,學習hyperf也避免不了要去學習定時任務,寫這篇文章也是參考官方文檔給出的教程,希望能給一起學習的人提供幫助,如有不足歡迎指正。

hyperf/crontab 組件爲您提供了一個 秒級 定時任務功能,只需通過簡單的定義即可完成一個定時任務的定義。
使用hyperf定時任務,需要安裝定時任務組件,通過composer安裝,命令如下:

安裝

sudo composer require hyperf/crontab

使用

啓用任務調度器進程
在 config/autoload/processes.php 內註冊一下 Hyperf\Crontab\Process\CrontabDispatcherProcess 自定義進程,如下:

return [
    Hyperf\Crontab\Process\CrontabDispatcherProcess::class,
];

將 config/autoload/crontab.php 內的 enable 配置設置爲 true,表示開啓定時任務功能,如配置文件不存在可自行創建,配置如下:

<?php
return [
    // 是否開啓定時任務
    'enable' => true,
];

通過配置文件定義定時任務

您可於 config/autoload/crontab.php 的配置文件內配置您所有的定時任務,文件返回一個 Hyperf\Crontab\Crontab[] 結構的數組

<?php
use Hyperf\Crontab\Crontab;

return [
    //是否開啓定時任務
    'enable'  => true,

    //通過配置文件定義定時任務
    'crontab' => [
        //Callback類型定時任務(默認)
        (new Crontab())->setName('Foo')->setRule('* * * × ×')->setCallback([App\Task\FooTask::class,'execute'])->setMemo('這是一個示例的定時任務'),

    ],

];

通過註解定義

在app/task目錄新建FooTask文件,沒有此目錄手動創建

<?php
namespace App\Task;

use Hyperf\Contract\StdoutLoggerInterface;
use Hyperf\Crontab\Annotation\Crontab;
use Hyperf\Di\Annotation\Inject;

/**
 * @Crontab(name="Foo", rule="* * * * *", callback="execute", memo="這是一個示例的定時任務")
 */
class FooTask
{

    /**
     * @Inject()
     * @var \Hyperf\Contract\StdoutLoggerInterface
     */
	private $logger;

    public function execute()
    {
        $this->logger->info(date('Y-m-d H:i:s', time()));
    }
}

運行定時任務

完成上述的配置後,以及定義了定時任務後,只需要直接啓動 Server,定時任務便會一同啓動,日誌信息會打印在控制檯
在這裏插入圖片描述

定時任務寫入日誌文件而不是控制檯

步驟和上面一樣,只是控制器內容稍有不同。這裏教程不使用註解模式,改用依賴注入模式
引入Hyperf\Logger\LoggerFactory,定義$logger私有屬性,通過構造函數依賴注入,啓用server

<?php
namespace App\Task;

use Hyperf\Contract\StdoutLoggerInterface;
use Hyperf\Crontab\Annotation\Crontab;
use Hyperf\Di\Annotation\Inject;
use Hyperf\Logger\LoggerFactory;

/**
 * @Crontab(name="Foo", rule="* * * * *", callback="execute", memo="這是一個示例的定時任務")
 */
class FooTask
{
    private $logger;

    public function __construct( LoggerFactory $loggerFactory )
    {
        $this->logger = $loggerFactory->get('log','default');
    }


    public function execute()
    {
        $this->logger->info(date('Y-m-d H:i:s', time()));
    }
}

效果:
在這裏插入圖片描述

定時任務操作數據庫

在app/Model目錄下新建AdminModel文件對應數據裏的amdin表
AdminModel代碼:

<?php
declare(strict_types=1);

namespace App\Model;

use Hyperf\DbConnection\Model\Model;

class AdminModel extends Model
{
    /**
     * The table associated with the model.
     *
     * @var string
     */
    protected $table = 'admin';
    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [];
    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [];

    public function setUsername()
    {
        return self::where(['id'=>1])->update(['username'=>admin123]);
    }

}

在app/Task/FooTask文件裏引入模型,然後再構造函數裏依賴注入生成模型對象,在execute方法裏通過m模型對象調用AdminModel裏setUsername()方法

<?php
namespace App\Task;

use Hyperf\Contract\StdoutLoggerInterface;
use Hyperf\Crontab\Annotation\Crontab;
use Hyperf\Di\Annotation\Inject;
use Hyperf\Logger\LoggerFactory;
use App\Model\AdminModel;

/**
 * @Crontab(name="Foo", rule="* * * * *", callback="execute", memo="這是一個示例的定時任務")
 */
class FooTask
{

//    /**
//     * @Inject()
//     * @var \Hyperf\Contract\StdoutLoggerInterface
//     */
    private $logger;

    private $adminModel;

    public function __construct( LoggerFactory $loggerFactory , AdminModel $adminModel)
    {
        $this->logger = $loggerFactory->get('log','default');
        $this->adminModel = $adminModel;
    }


    public function execute()
    {
        //$this->logger->info(date('Y-m-d H:i:s', time()));
        $this->adminModel->setUsername();
    }


}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章