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

4

我想在共享托管服务器上运行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个回答

10

您收到的错误信息:

内存限制为33554432字节,已用尽(尝试分配19456字节)

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

; 33554432/1024/1024
        32

这说明PHP在尝试分配19 Kbytes时失败了,但已经有近32MB的内存被分配了——这些分配没有失败,因为它们的总和小于32 MB。

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


考虑到memory_limit是一种安全机制,如果您的托管提供商允许您更改其值,那么这将很奇怪……

如果您使用的是共享主机,则意味着服务器上的任何人都可以获得所需的任何内存……对于同一服务器上的其他用户来说,这样并不好!

顺便说一下:32MB实际上是一个相当合理的值——我从未看到过配置为允许Web应用程序使用超过32 MB的服务器……而PHP 5.2的默认值似乎是16 MB,根据手册
(我已经使用Drupal工作了几个月)


关于错误500,我没有太多想法……一个可能性是safe_mode被激活,不允许在执行时设置memory_limit

手册似乎没有对此做出太多解释,但在max_execution_time指令下有一些信息:

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

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


1
有趣的是,这篇关于Drupal.org的文章提到,对于使用ImageAPI GD等功能的网站,建议内存为96MB:http://drupal.org/node/29268 - Amber
2
96MB?哎呀!这太多了...我应该试着把这个告诉负责我们服务器配置的那个人,只是为了看看他的表情^^ - Pascal MARTIN
我将memory_limit设置为32M,很多客户抱怨他们的图片上传后出现“白屏”。当我在开发中检查时,发现错误与初始贴文提到的错误完全相同,所以我确实将其增加了(不记得是64M还是96M),问题解决了。 - karim79
@karim79:感谢提供的信息;我需要对大型图像进行一些测试,因为这是我目前正在处理的项目。现在了解这一点比让我们的客户告诉我们“这不起作用”要好得多——特别是,我需要比较GD和imagemagick后端之间的差异... - Pascal MARTIN
1
内存限制的安全方面是为了防止您的网站失控并造成过多的混乱;确切的级别远不如有一个限制重要。在我的任何Drupal主机上,我从未遇到将内存限制提高到64M或96M的问题。 - Bevan

1

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

然而,当涉及到Drupal时,您是正确的添加了

ini_set('memory_limit', 'xxxM');

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

Drupal有很多故障保护措施,这是其中之一,Drupal会阻止您耗尽内存。

因此,请与您的托管公司联系,增加内存并在settings.php文件中设置memory_limit。

我通常只在脚本的最底部添加此行,但您实际上可以在任何地方添加它。

阅读此内容以了解其他遇到类似问题并在Drupal中采用多种方法解决的人们的经验。

http://drupal.org/node/29268

祝你好运


1
如果你设置了memory_limit,但是在达到最大限制之前就出现了内存不足的错误,其中一个罪魁祸首可能是生成进程的上游系统:Apache。
在 Apache 的配置文件(/usr/local/apache/conf/httpd.conf)中,你会找到一个指令,它为处理请求的所有子进程(Drupal 在这些进程中运行)设置了一个上限。一个 Apache 服务器可能会处理多个客户端(包括你和其他一些人)。如果允许一个客户端独占所有内存,那么其他人都会遭受“不幸”(tm)。为了避免这种情况,他们会限制每个进程可以使用的内存量。
例如:
# rlimits, do not modify
#  Setting single-process size 
#RLimitMEM 85643200 104857600
RLimitMEM 134217728 537395200

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

当然,如果您使用的是共享服务器,则很可能无法更改此配置。实际上,这可能是您的主机提供商会更改的配置。

顺便说一下,Host Gator似乎为每个进程提供约80Mb。 PHP运行时似乎需要约16Mb。


1
将它放在你的php.ini文件中。请请求你的主机重启Apache。这个Drupal.org节点将指导你如何完成这个步骤。如果你使用共享主机,Drupal.org上有针对大多数流行提供商如何更改你的php.ini文件的逐步指南。只需要搜索“提供商名称增加内存限制”即可找到相关指南。

正好是我打算要发布的链接。 - Bevan

0

请询问您的提供者为什么不起作用。我猜想他们限制了您可以使用的内存量,并且不允许将其设置得更高,或者您正在运行在一个根本没有您请求的内存量的虚拟主机中(这可能是错误500的原因)。


0

许多共享主机提供商不允许您提高PHP的内存限制,因为他们不希望共享盒子上的一个站点占用其他站点在同一台机器上的内存。我建议阅读您的托管提供商有关PHP的FAQ和其他内容,它可能会列出任何此类限制。

旁边的问题:19456小于33554432。为什么它说允许的大小已经耗尽了?

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接