增加PHP内存限制(Apache,Drupal6)

时间:2009-09-06 21:48:15

标签: php apache drupal drupal-6 memory-limit

我正在尝试在共享托管服务器上运行Drupal安装。 (我只是订阅了一个提供商 - 我没有这个盒子。)

我需要增加Apache服务器的PHP内存限制。我试过了

ini_set('memory_limit', '64M');

在settings.php(每个请求中包含的文件)中,但这会导致内部服务器错误500.如果我将其取出,我会收到此错误:

Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 19456 bytes)...

附带问题:19456小于33554432.为什么说允许的尺寸已用尽?

我也试过把它放在.htaccess:

 php_value memory_limit                 128M 

这没有效果。

6 个答案:

答案 0 :(得分:10)

您收到的错误消息:

  

允许的内存大小为33554432字节   筋疲力尽(试图分配19456   字节)

表示您正在尝试分配超过允许使用的33554432字节;即32 MB:

; 33554432/1024/1024
        32

它表示失败的分配是当PHP试图分配19 KB时;但已经分配了近32MB - 这些分配没有失败,因为它们的总数小于32 MB。

错误消息的“19456字节”部分不是真正相关的部分:相关的是您的memory_limit设置为32 MB。


考虑到memory_limit是某种安全性,您的托管服务提供商允许您更改其价值会很奇怪......

如果你在共享主机上,那就意味着服务器上的任何人都可以获得他们想要的任何数量的内存......对于同一台服务器上的其他用户来说,这不会那么好!

BTW:32MB实际上是一个非常合理的值 - 我从未见过一个服务器配置为允许超过32 MB的Web应用程序...而且PHP 5.2的默认值似乎是16 MB,根据the manual
(我和Drupal一起工作了几个月)


关于错误500,我没有太多想法......一种可能是safe_mode被激活,并且它不允许在执行时设置memory_limit。

手册中没有多说这些内容,但max_execution_time指令下有一些信息:

  

您无法使用更改此设置   在安全模式下运行时ini_set()。   唯一的解决方法是关闭   安全模式或改变时间   在php.ini中限制。

我认为memory_limit也是如此;无论如何,这似乎是合乎逻辑的。

答案 1 :(得分:1)

将它放在php.ini文件中。请求您的主机重启Apache。 drupal.org上的This节点将指导您完成该操作。如果您有共享主机,那么有关如何在drupal.org上为大多数更受欢迎的提供商更改php.ini的分步指南。只需搜索“PROVIDER_NAME增加内存限制。”

答案 2 :(得分:1)

您需要与您的托管公司核实他们允许您多少内存,因为只有他们能够更改内存,如果他们不会增加它,那么我建议寻找新的主机公司。

然而,当谈到drupal时,你添加

是正确的
ini_set('memory_limit', 'xxxM');

到settings.php文件。 (xxx =所需的内存)

Drupal有很多失败保险箱,这是其中之一,drupal阻止你耗尽记忆。

请与托管公司联系,将其增加并在settings.php文件中设置memory_limit。

我通常只是在脚本的最底部添加这一行,但你可以在任何地方添加它。

为其他有类似问题的人阅读本文,并且有很多方法可以在drupal中解决这个问题。

http://drupal.org/node/29268

祝你好运

答案 3 :(得分:0)

询问您的提供商为何无效。我猜他们会限制你可以使用的内存量,并且不允许它设置得更高,或者你在一个虚拟主机内运行,它只是没有你请求的内存量(这可能是因为错误500)。

答案 4 :(得分:0)

许多共享托管服务提供商不允许您提高PHP的内存限制,因为他们不希望共享框上的一个站点占用同一台计算机上其他站点的内存。我建议您阅读您的托管服务提供商的常见问题解答以及有关PHP的内容,它可能会列出任何此类限制。

  

附带问题:19456不到   33554432.为什么说允许的尺寸已经用完了?

较小的数字只是请求的大小,导致总分配数量超过限制 - 而不是所有分配请求的实际总数。因此,如果已经分配了33540000个字节,并且请求了另一个大小为19456的对象,那么您将收到该消息。

答案 5 :(得分:0)

如果你设置memory_limit并且内存错误低于最大值,那么上游系统产生你的进程就会产生一个罪魁祸首:Apache。

在Apache配置(/usr/local/apache/conf/httpd.conf)中,您将找到一个指令,为处理请求的所有子进程设置上限(Drupal在此类进程中运行)。给定的Apache服务器可以处理多个客户(您和其他一些客户)。如果他们允许一个客户占用所有内存,那么其他所有人都会有BadTime(tm)。为了避免这种情况,他们会限制每个这样的过程可以有多少内存。

例如:

# rlimits, do not modify
#  Setting single-process size 
#RLimitMEM 85643200 104857600
RLimitMEM 134217728 537395200

在这里,我已经注释了我的托管服务设置的原始值并增加了它们。

当然,如果您在共享服务器上,那么您极不可能更改此配置。实际上,这可能是主机提供商改变的配置。

FWIW,Host Gator似乎为每个进程提供~80Mb。 PHP运行时似乎需要大约16Mb。