tp5.1_队列queue学习

安装:
composer require topthink/think-queue 2.0

<?php 
//composer require topthink/think-queue 2.0

//在config目录配置queus.php 做如下参数配置

return [
    // 'connector' => 'Sync'
     'connector' => 'Database',   // 数据库驱动
      'expire'    => 60,           // 任务的过期时间,默认为60秒; 若要禁用,则设置为 null
      'default'   => 'default',    // 默认的队列名称
      'table'     => 'tp5_jobs',   // 存储消息的表名,不带前缀
      'dsn'       => [],
];


/*1.先在控制器里添加下面两个方法*/

namespace app\index\controller;

use think\Controller;
use think\Queue;
use think\Db;

class Index extends Controller
{

    public function queueTest(){
        $data = [
            'order_no' =>rand(100000,999999),
        ];
        $this->add($data['order_no']);
        $data = json_encode($data);
        $res =Queue::push('Job1', $data, $queue = null);
        var_dump($res);
        
    }

    public function add($orderNo){
        $data =[
            'order_no'=>$orderNo,
            'msg'=>$orderNo,
            'create_time'=>date('Y-m-d H:i:s'),
        ];
        Db::name('tp5_test')->insert($data);
    }

}

/*2.在app/job/Job1.php创建文件,并添加如下代码*/
//Job1 这个在app\job 下新建一个.php 写一个Job1类



namespace app\job;

use think\queue\Job;
use think\Db;
use think\Controller;

class Job1 extends Controller
{

    public function fire(Job $job, $data)
    {

        //....这里执行具体的任务
      $data = json_decode($data,true);
      if($this->jobDone($data))
      {
          $job->delete();
          print("<info>Hello Job has been done and deleted"."</info>\n");
      }else{
          $job->release(3); //$delay为延迟时间
      }

      if ($job->attempts() > 3) {
          //通过这个方法可以检查这个任务已经重试了几次了

      }

        //如果任务执行成功后 记得删除任务,不然这个任务会重复执行,直到达到最大重试次数后失败后,执行failed方法
        // $job->delete();

        // 也可以重新发布这个任务
        // $job->release($delay); //$delay为延迟时间

    }

    public function failed($data)
    {

        // ...任务达到最大重试次数后,失败了
    }

    public function jobDone($data)
    {

      print("<info>Job is Done status!"."</info> \n");

       return Db::name('tp5_test')->where('order_no',$data['order_no'])->update(['status'=>2]);

    }

}

/*3. 添加两张表*/

//数据测试表

DROP TABLE IF EXISTS `tp5_test`;
CREATE TABLE `tp5_test` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `order_no` varchar(50) NOT NULL COMMENT '订单号',
  `msg` varchar(255) NOT NULL COMMENT '消息内容',
  `status` tinyint(1) NOT NULL COMMENT '状态 0未执行,1 执行',
  `create_time` datetime NOT NULL COMMENT '创建时间',
  `update_time` datetime NOT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='测试表';



//消息队列表

DROP TABLE IF EXISTS `tp5_jobs`;
CREATE TABLE `tp5_jobs` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `queue` varchar(255) NOT NULL,
  `payload` longtext NOT NULL,
  `attempts` tinyint(3) unsigned NOT NULL,
  `reserved` tinyint(3) unsigned NOT NULL,
  `reserved_at` int(10) unsigned DEFAULT NULL,
  `available_at` int(10) unsigned NOT NULL,
  `created_at` int(10) unsigned NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;



/*4. 消息的创建与推送*/

//在浏览器里打开

http://demain/index/index/queueTest


/* 5.消息的消费与删除*/

//windows 在 cmd里在网站根目录运行     linux找到当前网站根目录  当然你php命令必须能执行。

//执行一行

php think queue:work --queue -v

//循环执行

php think queue:work --daemon


//最后自己在数据库中体会队列原理。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

长安员外

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值