ThinkPHP5.1.4x队列异步提交使用教程

Queue说明

think-queue是ThinkPHP官方提供的一个消息队列服务,是专门支持队列服务的扩展包。think-queue消息队列适用于大并发或返回结果时间比较长且需要批量操作的第三方接口,可用于短信发送、邮件发送、APP推送。think-queue消息队列可进行发布、获取、执行、删除、重发、失败处理、延迟执行、超时控制等操作。

Composer安装

composer require topthink/think-queue:v2.0.4

配置文件

config目录下新建queue.php,这里使用的是redis扩展如果没有安装的可自行去安装redis扩展

 

<?php

return [

    'connector'  => 'Redis',            // Redis 驱动

    'expire'     => null,                // 任务的过期时间,默认为60秒; 若要禁用,则设置为 null

    'default'    => 'default',        // 默认的队列名称

    'host'       => '127.0.0.1',        // redis 主机ip

    'port'       => 6379,            // redis 端口

    'password'   => '',                // redis 密码

    'select'     => 0,                // 使用哪一个 db,默认为 db0

    'timeout'    => 0,                // redis连接的超时时间

    'persistent' => false,            // 是否是长连接

];

在控制器中使用

在index控制器中使用addjob()方法

//需要usequeue
use think\Exception;
use think\Queue;
//引用上方的
public function addjob()

    {

        //添加队列

        $jobHandlerClassName  = 'app\jobs\Accountsubmit';

        // 2.当前任务归属的队列名称,如果为新队列,会自动创建

        $jobQueueName        = "accountsubmit";

        // 3.当前任务所需的业务数据 . 不能为 resource 类型,其他类型最终将转化为json形式的字符串

        //   ( jobData 为对象时,需要在先在此处手动序列化,否则只存储其public属性的键值对)

        $jobData = ['ts' => time(), 'bizId' => uniqid(), 'a' => 1];

        // 4.将该任务推送到消息队列,等待对应的消费者去执行

        $isPushed = Queue::push($jobHandlerClassName, $jobData, $jobQueueName);

       

        // database 驱动时,返回值为 1|false  ;   redis 驱动时,返回值为 随机字符串|false

        if (

            $isPushed !== false

        ) {

            echo date('Y-m-d H:i:s') . " 队列任务添加成功" . "<br>";

        } else {

            echo 'Oops, something went wrong.';

        }

    }

新建Job模块,模块下建立上方 'app\jobs\Accountsubmit'; 中的Accountsubmit控制器

<?php

/*

 * @Description:

 * @Date: 2022-12-13 10:58:56

 * @LastEditTime: 2022-12-13 10:59:11

 * @FilePath: \hao.la\application\jobs\Accountsubmit.php

 */
namespace app\jobs;

use think\queue\Job;

use think\Db;

class Accountsubmit

{

    /**

     * 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->kejinshou($data);

        print("<info>开始执行可仅售 提交任务" . "</info>\n");

        if ($isJobDone) {

            print($isJobDone);

            //如果任务执行成功, 记得删除任务

            $job->delete();

            print("<info>可仅售任务被删除了" . "</info>\n");

        }

        $zuJos = $this->zuhaowan($data);

        print("<info>开始执行租号玩 提交任务" . "</info>\n");

        if ($zuJos) {

            print($zuJos);

            //如果任务执行成功, 记得删除任务

            $job->delete();

            print("<info>租号玩任务被删除了" . "</info>\n");

        }

    }

    /**

     * 有些消息在到达消费者时,可能已经不再需要执行了

     * @param array|mixed    $data     发布任务时自定义的数据

     * @return boolean                 任务执行的结果

     */
    private function checkDatabaseToSeeIfJobNeedToBeDone($data)

    {

        //逻辑处理

        return true;

    }

    /**

     * 根据消息中的数据进行实际的业务处理

     * @param array|mixed    $data     发布任务时自定义的数据

     * @return boolean                 任务执行的结果

     */
    public function kejinshou($data)

    {

        $re =  msCurlGet('https://tenapi.cn/qqname/?qq=3494490');

        $re = json_decode($re, true);

        if ($re['code'] == '200') {

            return $re['mail'];

        } else {

            return false;

        }

    }

    public function zuhaowan($data)

    {

        $re =  msCurlGet('https://tenapi.cn/qqname/?qq=304366');

        $re = json_decode($re, true);

        if ($re['code'] == '200') {

            return $re['mail'];

        } else {

            return false;

        }

    }

}

然后在项目根目录cmd,linux的话直接就终端进入到项目根目录

php think queue::word --deamon --queue accoutsubmit  //accoutsubmit 为上方$jobQueueName 变量值 可自行参考

这里以win为例子,输入后回车

ThinkPHP5.1.4x队列异步提交使用教程

然后访问你index中的方法 就能看到队列异步执行了,这里中文我这是乱码的话可以忽略,用就是这么用的

ThinkPHP5.1.4x队列异步提交使用教程

文章链接:https://www.iamms.cn/technology/172.html
文章标题:ThinkPHP5.1.4x队列异步提交使用教程
文章版权:默笙 所发布的内容,部分为原创文章,转载请注明来源,网络转载文章如有侵权请联系我们!
本文最后更新发布于2022年12月16日 9时56分00秒,某些文章具有时效性,若有错误或已失效,请在下方留言或联系:304366@qq.com

给TA打赏
共{{data.count}}人
人已打赏
技术

mysql 将字段复制到另一个字段

2022-12-11 0:00:29

技术

js/jquery监听键盘事件,附上jq在线引用地址

2022-12-15 8:41:43

0 条回复A文章作者M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索
我是底线可爱胖!冲鸭~