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