Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
Laravel中用Observer事件致Redis队列异常问题_创想鸟

Laravel中用Observer事件致Redis队列异常问题

下面由laravel教程栏目带大家分享记录关于laravel observer 导致 redis 队列异常问题,希望对大家有所帮助!

                                                                               

1、业务逻辑

新建某个模型之后,利用 Observer 模型事件 Created 推入异步短信发送队列

AppHttpControllersUsersController

    public function store(User $user)    {        DB::beginTransaction();        try{            $input = request()->validated();            $user->fill($input);            $user->save();            //do something......            //其他数据表操作            DB::commit();        } catch ($e Exception) {            DB::rollBack();        }    }

AppObserversUserObserver

class UserObserver{    public function created (User $user)    {        dispatch(new SmsQueue($user));    }}

2、发现异常

业务部门反馈偶尔有用户收取不到短信通知,我便查看日志发现偶尔有错误异常:No query results for model [AppModelsUser]. 表示找不到对应的模型

我敲不应该啊,我是在创建模型之后再进行队列调用……,遂对业务代码再进行仔细核查猜测应该是受事务影响。

验证猜想:

    public function store(User $user)    {        DB::beginTransaction();        try{            $input = request()->validated();            $user->fill($input);            $user->save();            //do something......            //其他数据表操作            sleep(3); //三秒之后再提交事务                        DB::commit();        } catch ($e Exception) {            DB::rollBack();        }    }

果然在等待三秒之后提交队列异常已是 100%  触发。

3、原因分析

$user->save() 这个方法创建数据成功,便会一并触发调度器,将模型事件一一执行。

在事件中推送模型至队列中,而队列进程在不间断消费队列中数据。

在大部分情况下 do something 处理速度正常的话,队列进程将会照常运行。

如果在 do something 阶段偶尔出现延迟,造成事务还未 commit 而队列已经开始消费新模型;故引发上述错误。

然后我在搜索 Github Issues 记录时,发现此问题在 2015 年的一个 Issue 已经有人提出,而在 Laravel 8.X 中终于新增了对事务模型事件的支持;learnku.com/docs/laravel/8.x/eloqu… ,在社区文档似乎并没有找到相关说明~

问问小宇宙 问问小宇宙

问问小宇宙是小宇宙团队出品的播客AI检索工具

问问小宇宙 77 查看详情 问问小宇宙

由于我的版本是 6.x 所以用不了这个新特性[哭唧唧]~~

4、解决异常

1. 修改 MySQL 事务隔离级别(不推荐)

这里涉及到 MySQL 的事务隔离级别,InnoDB 引擎的默认隔离级别是 REPEATABLE READ,关于各个级别的区别可以在 官方文档 找到。

将隔离级别切换到 READ UNCOMMITTED 即可解决此问题,但是为了防止出现更大的问题我劝你别用这种方式~

2. 增加事件监听

查看源码得知在事务完成之后,会调用对应的事件,所以只需增加对事件的监听即可。

49a1a27437e415b13a60d6c2bf27277.png

新增类 AppHandlersTransactionHandler

class TransactionHandler{    public array $handlers;    public function __construct()    {        $this->handlers = [];    }    public function add(Closure $handler)    {        $this->handlers[] = $handler;    }    public function run()    {        foreach ($this->handlers as $handler) {            $handler();        }        $this->handlers = [];    }}

创建辅助函数  app/helpers.php

if (! function_exists('after_transaction')) {    /*     * 事务结束之后再进行操作     * */    function after_transaction(Closure $job)    {        app()->singletonIf(AppHandlersTransactionHandler::class, function (){            return new AppHandlersTransactionHandler();        });        app(AppHandlersTransactionHandler::class)->add($job);    }}

创建监听  AppListenersTransactionListener

namespace AppListeners;use AppHandlersTransactionHandler;class TransactionListener{    public function handle()    {        app(TransactionHandler::class)->run();    }}

绑定监听 AppProvidersEventServiceProvider

namespace AppProviders;use AppListenersTransactionListener;use IlluminateDatabaseEventsTransactionCommitted;use IlluminateDatabaseEventsTransactionRolledBack;use IlluminateFoundationSupportProvidersEventServiceProvider as ServiceProvider;;class EventServiceProvider extends ServiceProvider{    /**     * The event listener mappings for the application.     *     * @var array     */    protected $listen = [        TransactionCommitted::class => [            TransactionListener::class        ],        TransactionRolledBack::class => [            TransactionListener::class        ]    ];}

更改调用方式  AppObserversUserObserver

class UserObserver{    public function created (User $user)    {        after_transaction(function() use ($user) {            dispatch(new SmsQueue($user));        });    }}

OK,一个优雅的解决方式就完成了~~

相关推荐:最新的五个Laravel视频教程

以上就是Laravel中用Observer事件致Redis队列异常问题的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/344000.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
苹果7中设置壁纸的操作步骤
上一篇 2025年11月5日 19:37:16
如何设置Windows10系统网卡优先级?
下一篇 2025年11月5日 19:37:26

相关推荐

  • 推荐!在Laravel中轻松容易的优化sql语句的扩展包

    推荐!在Laravel中轻松容易的优化sql语句的扩展包推荐!在Laravel中轻松容易的优化sql语句的扩展包推荐!在Laravel中轻松容易的优化sql语句的扩展包推荐!在Laravel中轻松容易的优化sql语句的扩展包

    下面由laravel教程栏目给大家介绍在laravel中轻松容易的优化sql语句的扩展包(laravel-soar),希望对需要的朋友有所帮助!                                                                              …

    2026年10月2日 • 用户投稿
    100
  • 关于Laravel Pipeline的解读

    下面由laravel教程栏目给大家解读laravel pipeline,希望对需要的朋友有所帮助! Laravel Pipeline解读 大家好,今天给大家介绍下Laravel框架的Pipeline。它是一个非常好用的组件,能够使代码的结构非常清晰。 Laravel的中间件机制便是基于它来实现的。 …

    2026年10月2日
    100
  • 在Laravel应用中如何使用pjax进行页面加速

    在Laravel应用中如何使用pjax进行页面加速在Laravel应用中如何使用pjax进行页面加速在Laravel应用中如何使用pjax进行页面加速在Laravel应用中如何使用pjax进行页面加速

    说明:phphub 使用 pjax 来加速网页的加载, 这篇文章是在开发完此功能后做的笔记. 相关推荐:《laravel教程》 什么是 Pjax .–. / ## a a ( ‘._) |’– | _.___/_ ___pjax___ .”> Y/|<'. '._…

    2026年10月2日 • 用户投稿
    000
  • laravel有什么技术

    laravel有什么技术laravel有什么技术laravel有什么技术laravel有什么技术

    laravel中的功能技术:1、Bundle;2、Eloquent ORM;3、应用逻辑;5、Restful控制器;6、自动加载类;7、视图组装器;8、反向控制容器;9、迁移,“Artisan”命令行工具;10、单元测试;11、自动分页等。 本教程操作环境:windows7系统、Laravel5版、…

    2026年10月2日 • 用户投稿
    000
  • Laravel6的新错误界面你知道是啥样子的吗?

    Laravel6的新错误界面你知道是啥样子的吗?Laravel6的新错误界面你知道是啥样子的吗?Laravel6的新错误界面你知道是啥样子的吗?Laravel6的新错误界面你知道是啥样子的吗?

    下面由laravel教程栏目给大家介绍关于laravel 6 的新错误界面,希望对需要的朋友有所帮助! Ignition 将会成为 Laravel 6 的新错误界面 作为 Laracon EU 2019 的一部分,Freek van der Herten 和 Marcel Pociot 共同宣布了他…

    2026年10月2日 • 用户投稿
    100
  • 10个优质的用来搭建 Laravel 应用的包(分享)

    10个优质的用来搭建 Laravel 应用的包(分享)10个优质的用来搭建 Laravel 应用的包(分享)10个优质的用来搭建 Laravel 应用的包(分享)10个优质的用来搭建 Laravel 应用的包(分享)

    下面由laravel教程栏目给大家推荐分享10 个优质的 laravel 扩展包,用以提升开发速度,希望对大家有所帮助! 这里有 10+ 个用来搭建 Laravel 应用的包 为何会创建这个包的列表?因为我是一个「比较懒」的开发者,在脸书上是多个 Laravel 小组的成员。平日遇到最多的问题就是开…

    2026年10月2日 • 用户投稿
    300
  • 通过实例来了解Laravel中管道的使用方法

    通过实例来了解Laravel中管道的使用方法通过实例来了解Laravel中管道的使用方法通过实例来了解Laravel中管道的使用方法通过实例来了解Laravel中管道的使用方法

    下面由laravel教程栏目带大家了解一下laravel中的管道,分享一个laravel中的管道的使用实例,希望对大家有所帮助! 从代码的角度介绍管道的实际使用方式。有关管道的说明,网上已有较多的篇幅介绍,自行查阅。本篇博客是使用管道处理名字, 实现统一处理的目的。 背景:目前能找到的使用管道的介绍…

    2026年10月2日 • 用户投稿
    200
  • Laravel8出新功能啦!通过禁用延迟来定位N+1问题

    Laravel8出新功能啦!通过禁用延迟来定位N+1问题Laravel8出新功能啦!通过禁用延迟来定位N+1问题Laravel8出新功能啦!通过禁用延迟来定位N+1问题Laravel8出新功能啦!通过禁用延迟来定位N+1问题

                                                                                    在laravel 8的下一个版本中,您可以完全禁用延迟加载,从而导致异常: 防止N+1问题? @themsaid最近对框架的贡献允许您完全禁…

    2026年10月2日 • 用户投稿
    000
  • Laravel图片上传路径存储错误及最佳实践

    本文深入探讨了在Laravel中上传图片并将其路径存储到数据库时常见的“Creating default object from empty value”错误。文章分析了错误产生的根源,并提供了清晰的解决方案,包括如何正确初始化对象、避免冗余赋值,以及使用Laravel的存储系统(特别是公共磁盘)来…

    2026年10月2日
    100
  • Laravel Octane是什么?怎么用?

                                                                                    taylor otwell 已经在他的 laracon 在线演讲中展示了 laravel 最新的开源包 octane,新的包在 github…

    2026年10月2日
    000
  • 简析laravel怎么局部排除中间件

    简析laravel怎么局部排除中间件简析laravel怎么局部排除中间件简析laravel怎么局部排除中间件简析laravel怎么局部排除中间件

                                                                                    下面由laravel教程栏目带大家介绍关于laravel 局部排除中间件,希望对大家有所帮助! 一个方法处理已登录的的用户 和 未登录的用户…

    2026年10月2日 • 用户投稿
    100
  • laravel new blog安装为什么会出错?(解析及方法)

    下面由laravel教程栏目带大家介绍关于如何解决laravel new blog安装报错的问题,希望对大家有所帮助! 关于 laravel new blog 安装报错问题 具体问题描述: 使用 laravel 命令下载个新的 laravel 包提示: Your requirements could…

    2026年10月2日
    100
  • 解析Laravel事件系统的使用方法

    下面由laravel教程栏目带大家介绍关于laravel事件系统的使用方法,希望对大家有所帮助! Laravel 事件系统用法总结 Laravel 的事件提供了一个简单的观察者实现,能够订阅和监听应用中发生的各种事件。事件类保存在 app/Events 目录中,而这些事件的的监听器则被保存在 app…

    2026年10月2日
    000
  • 详解Laravel使用多数据库的方法(附代码示例)

    下面由laravel教程栏目带大家介绍关于laravel使用多个数据库的方法,希望对大家有所帮助!                                                                                 使用 .env >= 5.0 (测…

    2026年10月2日
    300
  • 新鲜出炉的Laravel 速查表不要错过!

    新鲜出炉的Laravel 速查表不要错过!新鲜出炉的Laravel 速查表不要错过!新鲜出炉的Laravel 速查表不要错过!新鲜出炉的Laravel 速查表不要错过!

    下面由laravel教程栏目带大家介绍新鲜出炉的laravel 速查表,希望对大家有所帮助! Laravel 速查表 项目命令 // 创建新项目$ laravel new projectName// 运行 服务/项目$ php artisan serve// 查看指令列表$ php artisan …

    2026年10月2日 • 用户投稿
    200
  • Laravel目录权限你知道怎么设置吗?(两种方法)

                                                                                    如果你给任何文件夹777权限,就是允许任何人读取、修改、执行该目录中的任何文件。这意味着你已经给任何人(任何黑客或恶意的人在整个世界)的权限…

    2026年10月2日
    000
  • laravel如何快速实现数据填充(使用seeder)

    laravel如何快速实现数据填充(使用seeder)laravel如何快速实现数据填充(使用seeder)laravel如何快速实现数据填充(使用seeder)laravel如何快速实现数据填充(使用seeder)

    下面由laravel教程栏目带大家介绍laravel利用seeder实现数据表中填充数据,希望对大家有所帮助! laravel利用seeder实现数据表中填充数据 给大家演示一下如何快速填充数据表中的数据 首先要执行php artisan命令 会出现各种命令指示 查找到 php artisan ma…

    2026年10月2日 • 用户投稿
    000
  • laravel怎么在Nginx或Apache服务器上正确配置_laravel在Nginx/Apache服务器配置方法

    首先确保Web服务器指向Laravel的public目录并配置重写规则,Nginx需设置root和try_files指令,Apache需启用mod_rewrite并配置DocumentRoot及AllowOverride权限,最后调整文件权限与所有权以确保正常访问。 如果您尝试在服务器上部署 Lar…

    2026年10月2日
    100
  • 这7个建议,能让你学laravel事半功倍!

    下面由laravel教程栏目带大家推荐介绍关于学习 laravel 更有效率的七个建议,希望对大家有所帮助! 学习 Laravel 更有效率的七个建议 随着社区的发展,已经出现了很多现成的资源可以帮助你学习 Laravel。看起来很不错不是吗?不过,你该如何选择最好的一个?或者说,究竟哪个更适合你并…

    2026年10月2日
    000
  • 聊聊Laravel Carbon扩展包的作用及用法

    聊聊Laravel Carbon扩展包的作用及用法聊聊Laravel Carbon扩展包的作用及用法聊聊Laravel Carbon扩展包的作用及用法聊聊Laravel Carbon扩展包的作用及用法

    下面由laravel教程栏目带大家推荐介绍关于laravel carbon 扩展包,希望对大家有所帮助!                                                                                 Introduction Carb…

    2026年10月1日 • 用户投稿
    000

发表回复

登录后才能评论
关注微信