我们知道,距离我们上次在这个博客上写一篇文章已经有几周了——我们并没有偷懒,只是我们在 12 月有不少大型项目。尽管如此,我们还是感到内疚,所以我们决定现在写一篇文章,如果你想知道现在是什么,那么现在是美国东部标准时间 2016 年 12 月 31 日晚上 8:52。是的,今天是除夕夜,我们正在写一篇博文!
好了 - 这个介绍就够了。让我们从多汁的东西开始......
作为 Joomla 管理员,您可能已经在 Joomla 网站上看到过以下错误之一(或者您可能已经看到了这两个错误):
致命错误:允许的内存大小为 x 字节已耗尽(尝试分配 x 字节)
致命错误:内存不足(已分配 x)(尝试分配 x 字节)
对于未经训练的人来说,上述错误看起来或多或少是相同的:它们看起来像一个内存问题,这是正确的,它们是内存问题。但是,它们是完全不同的内存问题。不幸的是,大多数 Joomla 管理员认为上述错误是相同的,他们认为本文中提出的解决方案可以解决这两个错误。事实并非如此......
事实上,增加 php.ini 或 .user.ini 文件中的memory_limit可能会解决第一个问题,但肯定不会解决第二个问题。你看,第一个问题意味着 Joomla 网站已经超过了 PHP 实例允许的内存限制,而第二个问题意味着 Joomla 网站已经用完了所有可用内存。让我们给你举个例子......
假设您的默认 php.ini 的内存限制为 32 MB,并且您的服务器上有 2 GB 的 RAM。.如果您的 Joomla 网站上的页面超过 32 MB,那么您将看到允许的内存...致命错误。但是,如果您的 php.ini 文件中的内存限制设置为非常高的数字,例如 4096 MB(或 4 GB,这不应该是这种情况),并且您的服务器上有 2 GB 的 RAM,那么如果您的 Joomla 网站上的页面需要超过 2 GB,那么您将看到内存不足致命错误。
现在,如果您非常仔细地阅读上述段落,那么您的问题将是,为什么在现实生活中,有人会看到内存不足致命错误?问得好!
事实上,在实际场景中,永远不会引发内存不足致命错误,因为服务器的所有内存都已耗尽,引发该错误是因为超出了在 Apache 级别设置的硬限制,并且该硬限制是使用 Apache 中的 RLimitMEM 指令设置的。例如,在 httpd.conf 文件中包含以下内容...
RLimitMEM 33554432
…意味着您的 Joomla 网站上的内存使用量有 32 MB 的硬性限制,这意味着您的 Joomla 网站上需要超过 32 MB 的任何页面都将引发内存不足致命错误(假设 PHP memory_limit高于 32 MB,否则,该页面将引发允许的内存致命错误)。
那么,如何解决“内存不足”致命错误呢?
显然,解决此类错误可以通过注释掉 httpd.conf 文件中的整个 RLimitMEM 行,或者将 RLimitMEM 的值(也在 httpd.conf 中)增加到更高的值,然后重新启动 Apache 来完成。请注意,如果您使用的是 WHM,则可以从 WHM 中更改 RLimitMEM 的值,方法如下:
- 以 root 身份登录 WHM 控制台。
-
在左上角的搜索框中,搜索 Apache Configuration。
-
单击 Apache 配置。
-
向下滚动一点,然后单击 Memory Usage Restrictions。
-
在 Configure Apache RLimits 页面中,您可以禁用 RLimitMEM,也可以将其设置为更高的值。请注意,您需要重新启动 Apache 才能使设置生效。
如果您看到问题并且您正在使用共享主机,那么您应该联系您的托管公司,他们可能会为您增加它(但不要屏住呼吸,因为他们很可能不会)。