Hyperf定时任务 爬虫数据定时去重

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

去重最终数据

0 评论
内联反馈
查看所有评论