Laravel 的 CheckForMaintenanceMode 中间件中允许的内存大小耗尽

Posted

技术标签:

【中文标题】Laravel 的 CheckForMaintenanceMode 中间件中允许的内存大小耗尽【英文标题】:Allowed memory size exhausted in Laravel's CheckForMaintenanceMode middleware 【发布时间】:2017-03-16 08:55:14 【问题描述】:

我的 Laravel 5.2 应用程序出现以下错误:

E_ERROR:允许的内存大小为 536870912 字节已用尽(试图 分配73728字节)

/Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::handle

错误记录在服务器上并且错误率很低,这意味着问题是一种“随机”的,或者换句话说 - 仅发生在一小部分请求上。

据我所知,CheckForMaintenanceMode 是第一个在每个请求上运行的中间件。请求堆栈中内存耗尽的原因可能是什么?或者,我该如何调试?

顺便说一句,这就是中间件检查的全部内容:

public function isDownForMaintenance()

    return file_exists($this->storagePath().'/framework/down');

【问题讨论】:

鉴于实际的方法代码,这不可能耗尽您的内存。其他东西正在将内存使用量推到极限,而这恰好是压死骆驼的最后一根稻草。 【参考方案1】:

看起来有内存泄漏,不太容易查明真正的原因。这里有两种解决方案

1- 如前所述,第一个很简单,您当时的所有请求都在访问主机物理驱动器上的文件,这可能会耗尽您对生产实例物理驱动器的读取。

您可以放置​​在您自己的自定义中间件中,该中间件从数据库而不是物理文件中检查此维护。请按照这个答案方法来定制中间件。

https://laracasts.com/discuss/channels/general-discussion/laravel-5-maintenance-mode/replies/32133

您可以通过在维护模式下对您的应用进行负载测试并先修复该问题,在您的开发环境中重现此问题。

2 - (需要更长的时间)您需要确定哪个 url 实际上最常出现此错误。您可以将日志推送到外部方,例如纸质记录或 sumologic,或者如果您使用文件处理程序存储日志,则可以挖掘您的日志文件。基本上一些事件流可以提供帮助。

然后您可以在调用时运行 blackfire.io 以查看哪个函数消耗的内存最大,这可能会让您知道是什么原因造成的。

【讨论】:

谢谢,Tariq,第二种方法让我走上了正轨。我已经确定了一条很可能是泄漏源的特定路线。我会进一步调查,但我想我有一个可靠的优化候选人。

以上是关于Laravel 的 CheckForMaintenanceMode 中间件中允许的内存大小耗尽的主要内容,如果未能解决你的问题,请参考以下文章

laravel中使用的PDF扩展包——laravel-dompdf和laravel-snappy

找不到稳定性稳定的包 /laravel/laravel

在 Laravel 8 中安装 Laravel/ui 的问题

laravel 安装失败

laravel env怎么用

laravel框架用啥语言