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();
}
}