Hyperf定时任务 初体验,项目开发难免会用到定时任务去执行一些简单的操作,学习hyperf也避免不了要去学习定时任务,写这篇文章也是参考官方文档给出的教程,希望能给一起学习的人提供帮助,如有不足欢迎指正。
hyperf/crontab 组件为您提供了一个 秒级 定时任务功能,只需通过简单的定义即可完成一个定时任务的定义。
使用hyperf定时任务,需要安装定时任务组件,通过composer安装,命令如下:
安装
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('Distinct')->setRule('* * * * *')->setCallback([App\Task\DistinctTask::class, 'execute'])->setMemo('这是一个去重的定时任务'),
],
];
通过注解定义
在app/task目录新建FooTask文件,没有此目录手动创建
<?php
namespace App\Task;
use Hyperf\Contract\StdoutLoggerInterface;
use Hyperf\Crontab\Annotation\Crontab;
use Hyperf\Di\Annotation\Inject;
use Hyperf\Logger\LoggerFactory;
/**
* @Crontab(name="Distinct", rule="* * * * *", callback="execute", memo="这是一个去重的定时任务")
*/
class DistinctTask
{
/**
* @Inject()
* @var \Hyperf\Contract\StdoutLoggerInterface
*/
private $logger;
public function __construct( LoggerFactory $loggerFactory )
{
$this->logger = $loggerFactory->get('log','default');
}
public function execute()
{
$url="http://xxx.xxx.cn:9501/distinct";
$this->geturlinfo($url);
}
//get调用http接口
public function geturlinfo($url){
$method ="GET";
$curl = curl_init();
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_FAILONERROR, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HEADER, false);
$ret = curl_exec($curl);
$all=json_decode($ret,true);
return $all;
}
//去重方法
public function distinct(){
$sql="DELETE from photos WHERE (title) in (SELECT title from (SELECT title FROM photos GROUP BY title HAVING COUNT(*)>1) s1) AND id NOT in (SELECT id from (SELECT id FROM photos GROUP BY title HAVING COUNT(*)>1) s2);";
$mm=Db::delete($sql);
return json_encode($mm);
}
}
rule定时任务的执行规则,在分钟级的定义时,与 Linux 的 crontab
命令的规则一致,在秒级的定义时,规则长度从 5 位变成 6 位,在规则的前面增加了对应秒级的节点,也就是 5 位时以分钟级规则执行,6 位时以秒级规则执行,如 */5 * * * * *
则代表每 5 秒执行一次。注意在注解定义时,规则存在 \
符号时,需要进行转义处理,即填写 *\/5 * * * * *
。crontab使用方法
config/routes.php加入
Router::get('/distinct', 'App\Task\DistinctTask::distinct');
运行定时任务
php bin/hyperf.php start
开始数据
运行控制台
日志文件runtime/logs/hyperf.log
去重最终数据