跳转到主内容
极星编程网:以代码为星,赴技术山海!

关于Laravel使用消息队列需要注意哪些?

本文主要给大家介绍了关于 laravel 使用消息队列需要注意的一些问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,希望能帮助到大家。 前言 消息队列对于大型的Web项目来说是必不可少的一个模块,通过消息队列可以解决大并发和多种语言通信接口等问题。对于大并发的问题,可以将耗时的任务或者不能同时大量并行的任务封装起来传输到消息队列中,由处理程序不断从消息队列中提取消息并进行处理,这样通过消息队列的缓冲可以使得在大并发情况下不再阻塞,如果性能不够用还可以添加多个处理任务从消息队列中获取消息进行处理。比如数据库的操作,当对数据库的读、写操作过多时就会存在锁表等问题,读的问题可以通过缓存等方案解决,写的问题就需要消息队列来解决。而且,在大型的Web项目开发中,很多情况下不可能通过一种语言实现,需要发挥不同语言的优势,比如PHP,虽然在理论意义上它可以做Web开发中的所有事情,但是有些问题用它解决效率将会非常低,比如实时socket连接和分布式事务处理等。 使用 Laravel 的消息队列处理异步任务,Redis 作为队列数据库,Supervisor 监控脚本异常中断并自动重启,这是 Laravel 处理队列任务的标准流程,但是实际中可能还会出现各种各样的问题,为了保证系统可靠性,还要注意几个问题。 一、执行失败重试次数设置 一定要设置任务执行失败重试次数,避免无限失败重试,超过重试次数 Laravel 会默认写到失败任务表中,也可以自己写执行失败后续处理逻辑。
php artisan queue:work redis --tries=3
需要先执行以下命令创建数据表:
php artisan queue:failed-table php artisan migrate
二、程序异常的处理 有时候程序执行过程会发生异常,比如依赖其他接口,请求 HTTP 接口超时等等,如果不捕捉异常,那么当前这个队列就会中断不能继续运行下去,比如给 10000 个用户推送内容,需要依赖接口推送,如果中间的请求挂了就会影响到后面的推送。 这里的异常是指程序执行过程中发生的异常,不是指常驻进程挂掉,程序异常不一定导致常驻进程中断,况且进程中断有 Supervisor 监控并重启。 如捕获异常代码片段:
try { $r = $client->request('POST', '', [ 'query' => [ 'client_name' => 'filemail', 'client_version' => '1.0', 'client_sequence' => 0, 'uid' => 692934013,//119481237 'r' => 1508312412484, ], 'body' => GuzzleHttpjson_encode($body), ]); $result = $r->getBody()->getContents(); $result = json_decode($result, true); if ($result['result'] == 0) { info("sendMail fail:" . json_encode($result)); $this->pushLog($task['id'], $task['mail_id'], implode(',', $userIds), json_encode($result), 0); } else { Log::warning("sendMail fail:" . json_encode($result)); $this->pushLog($task['id'], $task['mail_id'], implode(',', $userIds), json_encode($result), $result['result']); } } catch (RequestException $e) { Log::warning('RequestException' . $e->getMessage()); } catch (Exception $e) { Log::emergency('Exception' . $e->getMessage()); }
三、修改代码记得重启 Supervisor Laravel 13.2.0 PHP中文网提供Laravel 13.2.0版本下载,Laravel框架 是基于 PHP 8.3+ 的高性能框架,官方推荐通过 Composer 安装。它内置 AI SDK、JSON:API Resources 及原生向量搜索,支持属性驱动开发与队列路由,大幅提升开发效率。相比旧版,13.2.0 优化了缓存 TTL 管理与实时通信,无需 Redis 即可横向扩展。作为现代 Web 开发首选,它兼顾安全与极速体验,助您快速构建企业级应用。 下载 最后一点,修改了处理队列的程序,记得要重启 Supervisor,否则脚本不会生效。 Laravel 往 Redis 写队列的数据结构 队列用 list 类型存储,如图: value 内容如下:
{ "job": "Illuminate\Queue\CallQueuedHandler@call", "data": { "commandName": "App\Jobs\SendFile", "command": "O:17:"App\Jobs\SendFile":5:{s:23:"u0000App\Jobs\SendFileu0000task";a:8:{s:5:"title";s:4:"1111";s:4:"note";s:2:"11";s:6:"reward";s:0:"";s:7:"mail_id";s:5:"66681";s:4:"nums";i:20;s:8:"uid_file";s:33:"uidfile/file-66681-1513058185.txt";s:5:"gcids";s:40:"1B9DD95645AAE8119F7DA9B9FF738D52BC8A1BD5";s:2:"id";i:29;}s:6:"u0000*u0000job";N;s:10:"connection";N;s:5:"queue";s:8:"sendfile";s:5:"delay";N;}" }, "id": "l0mjsUthbxm4TgIJNUH13km9N8DIpErK", "attempts": 1 }
包含失败重试次数,队列标识,处理队列的类,以及队列的数据等等。 相关推荐: php实现消息队列类实例分享 关于php中beanstalkd消息队列的详解以及类的分享 PHP消息队列用法实例分析

相关文章