增加 PHP 内存限制(Apache、Drupal6)
Posted
技术标签:
【中文标题】增加 PHP 内存限制(Apache、Drupal6)【英文标题】:Increase PHP Memory limit (Apache, Drupal6) 【发布时间】:2010-11-26 02:06:04 【问题描述】:我正在尝试在共享托管服务器上运行 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
这没有效果。
【问题讨论】:
【参考方案1】:询问您的提供商为什么它不起作用。我猜他们限制了您可以使用的内存量并且不允许将其设置得更高,或者您在一个根本没有您请求的内存量的虚拟主机中运行(这可能是导致错误 500)。
【讨论】:
【参考方案2】:许多共享主机提供商不允许您提高 PHP 的内存限制,因为他们不希望共享服务器上的一个站点占用同一机器上其他站点的内存。我建议阅读您的托管服务提供商的常见问题解答以及关于 PHP 的其他内容,它可能会在那里列出任何此类限制。
附加问题:19456 小于 33554432. 为什么说允许的大小用尽了?
较小的数字只是导致总分配量超过限制的请求大小,而不是所有分配请求的实际总数。因此,如果已经分配了 33540000 字节,并且请求了另一个大小为 19456 的对象,那么您将收到该消息。
【讨论】:
【参考方案3】:您收到的错误消息:
允许的内存大小为 33554432 字节 用尽(试图分配19456 字节)
表示您正在尝试分配超过您允许使用的 33554432 个字节;即 32 MB:
; 33554432/1024/1024
32
表示分配失败是PHP尝试分配19Kbytes的时候;但是已经分配了将近 32MB -- 这些分配没有失败,因为它们的总数不到 32MB。
错误消息的“19456 字节”部分并不是真正相关的:相关的是您的 memory_limit
设置为 32 MB。
考虑到memory_limit
是某种安全性,您的托管服务提供商允许您更改其值会很奇怪...
如果您在共享主机上,这意味着服务器上的任何人都可以获得他们想要的任意数量的内存......这对于同一台服务器上的其他用户来说不是那么好!
顺便说一句:32MB 实际上是一个相当合理的值——我从未见过配置为允许 Web 应用程序使用超过 32MB 的服务器......根据 PHP 5.2 的默认值似乎是 16MB the manual。 (我已经使用 Drupal 工作了几个月)
关于错误 500,我没有太多想法……一种可能是 safe_mode
已激活,并且它不允许在执行时设置 memory_limit。
手册并没有对此多说,但max_execution_time
指令下有一些信息:
您无法更改此设置
ini_set()
在安全模式下运行时。 唯一的解决方法是关闭 安全模式或通过更改时间 php.ini 中的限制。
我想memory_limit
也是如此;无论如何,这似乎是合乎逻辑的。
【讨论】:
有趣的是,drupal.org 上的这篇文章提到,建议使用 ImageAPI GD 之类的网站使用 96MB:drupal.org/node/29268 96MB ?哎哟!有点多……我应该试着对负责我们服务器配置的人说,只是为了看他的脸^^ 我的 memory_limit 设置为 32M,很多客户抱怨他们的图片上传“空白筛选”。当我在开发中检查它时,错误与 OP 得到的错误一样,所以我确实增加了它(不记得 - 到 64M 或 96M)并且解决了问题。 @karim79:感谢您的信息;在这种情况下,对于我目前正在从事的项目,我将不得不对大图像进行一些测试:现在知道这一点比让我们的客户告诉我们“这不起作用”更好——尤其是,我会必须比较 GD 和 imagemagick 后端... 内存限制的安全方面是为了防止你的网站失控而造成太大的破坏;确切的水平远不如根本有限制的事实重要。在我的任何 drupal 主机上将内存限制提升到 64M 或 96M 时,我从来没有遇到过问题。【参考方案4】:把它放在你的 php.ini 文件中。要求您的主机重新启动 Apache。 drupal.org 上的This node 将引导您完成操作。如果您有共享主机,则在 drupal.org 上为大多数更受欢迎的提供商提供了有关如何更改 php.ini 的分步指南。只需搜索“PROVIDER_NAME 增加内存限制”即可。
【讨论】:
正是我自己要发布的链接。【参考方案5】:您需要与您的托管公司核实他们允许您使用多少内存,因为只有他们才能更改它,如果他们不会增加它,那么我建议寻找一个新的托管公司。
然而,当谈到 drupal,你是正确的添加
ini_set('memory_limit', 'xxxM');
到 settings.php 文件。 (xxx = 所需内存)
Drupal 有很多故障保险,这是其中之一,drupal 可以防止您耗尽内存。
因此请与您的托管公司确认,增加它并在 settings.php 文件中设置您的 memory_limit。
我通常只是在脚本的最底部添加这一行,但你可以在任何地方添加它。
为其他有类似问题并在 drupal 中有多种解决方法的人阅读这篇文章。
http://drupal.org/node/29268
祝你好运
【讨论】:
【参考方案6】:如果您设置 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。
【讨论】:
以上是关于增加 PHP 内存限制(Apache、Drupal6)的主要内容,如果未能解决你的问题,请参考以下文章