Laravel Horizo​​n: ErrorException: Warning: PDO::prepare(): MySQL 服务器已经消失

Laravel Horizon: ErrorException: Warning: PDO::prepare(): MySQL server has gone away

我正在努力解决使用 Horizo​​n 的生产服务器上的错误。

ErrorException: 警告: PDO::prepare(): MySQL 服务器已经消失 [内部] 反序列化

您可以在此处查看错误的堆栈跟踪:https://sentry.io/share/issue/b105b7946b524a9e841f56f44445ea14/

据我所知,这个错误应该被 Laravel 框架捕获。我不确定为什么它没有被捕获并变成 QueryException,然后触发重新连接 and/or 杀死工作人员。

参见:https://github.com/laravel/framework/blob/9fb420cc29a7dd5de5051f09c523ffc3ea01b969/src/Illuminate/Database/Connection.php#L663

然后:https://github.com/laravel/framework/blob/9fb420cc29a7dd5de5051f09c523ffc3ea01b969/src/Illuminate/Database/Connection.php#L735

我的理解是,任何异常都应该被捕获,然后作为 QueryException 重新抛出,然后框架会正确地捕获它,然后重新连接到数据库。

这是一个偶然的错误,因此很难重现;我曾尝试手动抛出类似的错误,但它被正确捕获并得到妥善处理。

任何关于此错误为何在生产中可能不同的一般指导以及关于我如何隔离错误的想法将不胜感激。

以防其他人遇到这个问题,目前的理论是 Sentry 正在捕获框架仍在正确处理的错误。

基本上,作业仍然正确完成,因为 MySQL 连接错误由框架自动处理。然而,Sentry 仍然在该错误处理过程中捕获错误,尽管原因目前未知。

作为参考,请参阅 Github 上的讨论:

https://github.com/laravel/horizon/issues/583