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为例子,输入后回车
然后访问你index中的方法 就能看到队列异步执行了,这里中文我这是乱码的话可以忽略,用就是这么用的