Joomla - 允许的内存大小为1073741824字节

时间:2014-08-09 16:23:04

标签: php joomla

我的joomla网站开始显示以下错误

致命错误:允许的内存大小为1073741824字节(尝试分配78个字节)

我知道我们可以使用ini_set增加内存限制,但我认为这不是解决此问题的正确方法。即使如果我将内存限制设置为无限(-1),我将得到内部服务器错误。我完全没有意识到这个网站上最近的活动,因为我刚刚被分配到这个任务。我尝试使用DB禁用一些插件和模块。我所做的是,只需从_modules_pluginsid的降序获取条目,然后将publish更改为0。但没有任何作用。我收到同样的错误(致命错误:允许记忆......)。我试图打开管理页面,也没有加载。只是显示一个空白页面。

请帮我解决这个问题。我是joomla的新手

7 个答案:

答案 0 :(得分:5)

我不相信你会对这类问题得到简明扼要的答案,因为它太宽泛了。听起来你有内存泄漏。参见:

  1. How to find which PHP script is leaking memory?
  2. Diagnosing Memory Leaks - Allowed memory size of # bytes exhausted
  3. 不幸的是,找到内存泄漏的原因很少是一项简单的任务。上面的两个链接确实提供了一些有用的提示,即拨打memory_get_usage以及Xdebug分机。

    即使你不是Joomla的新手并且更熟悉代码库,它也可能不会更容易解决这个问题。

答案 1 :(得分:4)

让我们从消息告诉你的内容开始。

PHP说我已成功为此代码分配 GIGABYTE 内存,但我现在需要分配另外78个字节,但我不能,因为我已达到我的限制。

该声明应该对你大喊大叫的部分是它已经为这个处理分配了一个GIGABYTE内存。这太荒谬了。

正如@mistermartin所建议的那样,某些代码会导致内存泄漏,或者您在流程失败时会遇到一些代码消耗大量内存

该消息通常与堆栈跟踪相关联,告诉您此错误发生在哪一段代码中,以及哪一段代码称为该等等。

问题:它是否总是发生在同一段代码中?如果是这样,那就是你开始寻找的地方。

我首先要查看堆栈跟踪中的所有代码,而不仅仅是实际打破了骆驼的特定脚本。回过头来看看已经执行的所有代码,寻找可能分配大量内存的东西,数组是一个很好的起点,但它们不是唯一的可能性。

我个人会将网站(包括数据库)复制到测试环境中,您可以使用一个体面的调试程序通过执行违规代码来遵循代码。 如果你不能设置一个调试器,那么至少在测试环境中你可以添加一些调试代码来告诉你以这么低的速率开始消耗内存的时间和地点。

答案 2 :(得分:2)

如果您正在寻找解决此问题的方法,请按照以下方法操作。但是没有建议使用它,因为它无法解决您对程序(代码)的问题。你仍然应该检查内存耗尽的原因。

1使用PHP代码

ini_set('memory_limit', '-1'); // This will take unlimited memory usage of server

正如你所说,上述方法对你不起作用。

2使用php.ini

Change the line in php.ini If your line shows 32M try 128M. 
memory_limit = 128M ; 
Maximum amount of memory a script may consume (128MB)

如何调试代码

您的程序消耗的内存超出了需要。如果您的循环已经失控并且您正在创建对象或在循环的每次传递中添加到数组,这通常可以在PHP中发生。检查无限循环。

How to find which PHP script is leaking memory?

答案 3 :(得分:1)

我对Joomla不太熟悉,但验证它通过类似于许多其他框架和应用程序的index.php文件重定向流量。找到泄漏的WHERE的第一步是在index.php文件中添加以下内容。:

function shutdown() {
    $aError = error_get_last();
    if ($aError["type"] == E_ERROR ) {
        openlog("Fatal Error Shutdown Log: ", LOG_ODELAY, LOG_USER);
        syslog(LOG_ERR, 'Message: ' . $aError['message'] . PHP_EOL);
        syslog(LOG_ERR, "File: " . $aError['file'] . PHP_EOL );
        syslog(LOG_ERR, "Line: " . $aError['line'] . PHP_EOL );
    }
}
register_shutdown_function( 'shutdown' );

检查系统日志中的字符串“致命错误关闭日志:”,它应该为您提供内存泄漏发生的具体位置。如果Joomla有一个更合适的位置来放置这个代码,那就去吧。从理论上讲,无论如何都会运行关机功能。所有这一切只记录您的系统日志中的致命错误。内存错误是致命错误。祝你好运。

答案 4 :(得分:1)

我遇到了一个类似的问题,有很长的SQL字符串(继承的代码将一个大规模的数组包含在IN条件中)。记录您的SQL查询并检查它们是否超过max_allowed_pa​​cket(1GB)

http://dev.mysql.com/doc/refman/5.1/en/packet-too-large.html

答案 5 :(得分:0)

我也有这个问题 - 对于我的/ administrator /文件夹。没有任何配置或php.ini内存限制更改修复了问题,我追查到这与我更改了/ administrator /文件夹的名称这一事实有关,以使黑客更难。如果代码使用相对路径,那么不应该有所作为,但显然有些代码没有。现在,我将文件夹重命名为默认值以使用管理员功能,然后返回到随机名称,以便为黑客提供更好的挑战。那么,你有没有改变任何文件夹名称???我希望这有助于某人。

答案 6 :(得分:-1)

您可以从启用Joomla调试开始。在Joomla 3上,它位于后端>全局配置> “系统”>调试系统

然后,在您网站的前端,您的模板应该提供一些调试信息。

我首先要查看“配置文件信息和内存使用”部分中的线索

祝你好运!

修改
不可否认,这有点远,但也许有一些Akeeba备份可以在网站上使用。寻找一些Akeeba .jpa文件,可能在site_root / administrator / components / com_akeeba / backup /

如果有,我会首先将它们恢复到另一台机器,这样你就可以排除任何与服务器php相关的错误。

也许你会幸运。