我目前正试图追踪内存大小已耗尽"错误,但由于多种原因,它证明是非常困难的。
由于错误的性质,它似乎并没有被我的" catch-all"错误处理程序(虽然我可能做错了)
我想知道它是否至少可以在记录的错误中加入$_SERVER['REQUEST_URI']
?
答案 0 :(得分:0)
原来,我正在做“全能”错误处理程序错误。
以下代码有助于解决我的问题:
register_shutdown_function(function() {
ini_set("memory_limit","-1");
$e = error_get_last();
if( $e) {
$info = "various debug info"; // as necessary
error_log("[".$_SERVER['REQUEST_URI']."] - ".$info);
}
});
这有助于缩小问题范围。
对于任何好奇的人,我遇到的问题是会话垃圾收集 - 由于服务器维护,有超过50万个会话需要清理,因缓冲查询将内存加载到内存中而容易溢出内存。这也解释了为什么它看起来如此随机......因为它是! GC是按概率调用的。我通过在用户请求上禁用会话GC并将其添加到我已经拥有的“常规清理”cron脚本来解决了潜在的问题。我还在查询中添加了LIMIT 1000
,以避免将来出现此类失控问题。有点令人不寒而栗,认为有人可以轻松地通过创建一个绝对的会话数来对我的网站进行DDoS,然后等待24小时让它们过期......