2024-07-04 fastadmin thinkphp5.0 queue 订单倒计时

一 、使用composer下载queue
thinkphp5.0的话使用这个

composer require topthink/think-queue=1.1.6

更高版本使用这个

composer require topthink/think-queue

二、创建者控制器
1、创建一个Job控制器,引入queue类
2、1 * 10 是等待时长,单位是秒
3、@前面是取消订单控制器的地址,要带着controller,后面是控制器里面的方法,默认为fire

<?php

namespace app\admin\controller;
use app\common\controller\Backend;
use think\Queue;


/**
 * 后台首页
 * @internal
 */
class Job extends Backend
{

    protected $noNeedLogin = ['login'];
    protected $noNeedRight = ['index', 'logout'];
    protected $layout = '';

    public function _initialize()
    {
        parent::_initialize();
        //移除HTML标签
        $this->request->filter('trim,strip_tags,htmlspecialchars');
    }
    public function createOrder()
    {
        // 创建订单业务代码
        Queue::later(1 * 10, 'app\admin\controller\Hello@closeOrder', 3);  //加入队列,并延迟关闭时间执行
    }

}

三、消费者控制器
1、引入job类
2、写自己逻辑的方法就行,注释都有

<?php
/**
 * 文件路径: \application\index\job\Hello.php
 * 这是一个消费者类,用于处理 helloJobQueue 队列中的任务
 */
namespace app\admin\controller;
use think\queue\Job;

class Hello {
    protected $noNeedLogin = ['*'];
    protected $noNeedRight = ['index', 'logout'];
    protected $layout = '';
    /**
     * fire方法是消息队列默认调用的方法
     * @param Job            $job      当前的任务对象
     * @param array|mixed    $data     发布任务时自定义的数据
     */
    public function fire(Job $job,$data){
        // 如有必要,可以根据业务需求和数据库中的最新数据,判断该任务是否仍有必要执行.
        $isJobStillNeedToBeDone = $this->checkDatabaseToSeeIfJobNeedToBeDone($data);
        if(!$isJobStillNeedToBeDone){
            $job->delete();
            return;
        }

        $isJobDone = $this->doHelloJob($data);

        if ($isJobDone) {
            //如果任务执行成功, 记得删除任务
            $job->delete();
            print("<info>22222222"."</info>\n");
        }else{
            if ($job->attempts() > 3) {
                //通过这个方法可以检查这个任务已经重试了几次了
                print("<warn>Hello Job has been retried more than 3 times!"."</warn>\n");
                $job->delete();
                // 也可以重新发布这个任务
                //print("<info>Hello Job will be availabe again after 2s."."</info>\n");
                //$job->release(2); //$delay为延迟时间,表示该任务延迟2秒后再执行
            }
        }
    }

    /**
     * 有些消息在到达消费者时,可能已经不再需要执行了
     * @param array|mixed    $data     发布任务时自定义的数据
     * @return boolean                 任务执行的结果
     */
    private function checkDatabaseToSeeIfJobNeedToBeDone($data){
        return true;
    }

    public function closeOrder(Job $job, $data)
    {
        print("<info>11111111111".$data."</info>\n");
        $job->delete();

    }
    /**
     * 根据消息中的数据进行实际的业务处理
     * @param array|mixed    $data     发布任务时自定义的数据
     * @return boolean                 任务执行的结果
     */
    private function doHelloJob($data) {
        // 根据消息中的数据进行实际的业务处理...

        print("<info>Hello Job Started. job Data is: ".var_export($data,true)."</info> \n");
        print("<info>Hello Job is Fired at " . date('Y-m-d H:i:s') ."</info> \n");
        print("<info>Hello Job is Done!"."</info> \n");

        return true;
    }
}

四、监听&进程守护

php think queue:listen

进程守护的话宝塔搜索就行

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容