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

时间:2017-03-16 08:55:14

标签: php laravel laravel-5.2

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

  

E_ERROR:允许的内存大小耗尽536870912字节(尝试过   分配73728个字节)

     

     

/照亮\基金会\ HTTP \中间件\ CheckForMaintenanceMode ::手柄

错误记录在服务器上,错误率很低,这意味着问题有点“随机”,换句话说 - 仅在很小比例的请求中发生。

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

BTW,这就是中间件检查的全部内容:

public function isDownForMaintenance()
{
    return file_exists($this->storagePath().'/framework/down');
}

1 个答案:

答案 0 :(得分:1)

看起来有内存泄漏,不容易找出真正的原因。这里有两个解决方案

1-第一个很容易,因为你提到当时的所有请求都是访问主机物理驱动器上的文件,这可能会耗尽你的Reads到生产实例的物理驱动器。

您可以放置​​在自己的自定义中间件中,该中间件从数据库而不是该物理文件中检查此维护。 Plz遵循这种自定义中间件的答案方法。

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

您可以通过在维护模式下对应用进行负载测试并在此处进行修复来在您的开发环境中重新设置此内容。

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

然后你可以在调用时运行blackfire.io,看看哪个函数消耗了最大内存,它可能会让你知道导致这个问题的原因。