【问题标题】:PHP: settings memory_limits > 1024M does not workPHP:设置 memory_limits > 1024M 不起作用
【发布时间】:2012-03-05 18:44:49
【问题描述】:

出于不好的原因,我需要将目录的 memory_limits 设置为高于 1 GB,但在我使用 Debian 5.0 (Lenny) 服务器上的 PHP 5.2.17 时,例如 2048M ,我只得到 php.ini 默认值(256M)。

PHP 作为 Apache 模块运行,phpinfo 为我们提供(用于目录):

memory_limit    1024M    256M
suhosin.memory_limit    0    0

是否有 Apache 模块或 PHP 配置的限制?我知道服务器只有 4 GB 的 RAM。这只是一个特殊的脚本。

【问题讨论】:

标签: php memory-limit


【解决方案1】:

您如何尝试设置内存限制? phpinfo() 显示当前 PHP 保留的内存限制,这是由于 php.ini 将其设置为内存限制而可用的。

如果您的服务器支持通过 .htaccess 设置 PHP 命令,则将其写入脚本目录中的 Apache .htaccess 文件可能会起作用:

php_value memory_limit 2048M

因为可能会关闭用于设置 PHP 值的 .htaccess 命令。然后你也可以从 PHP 代码中试试这个:

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

如果这不起作用并且 .htaccess 也不起作用,那么您需要联系服务器管理员。

【讨论】:

  • 我用php_value或ini_set,同样的问题:如果我设置512M或1024M,没关系,如果我设置1500M或2048M,我得到256Mo(来自php.ini的默认值)
  • 在这种情况下它似乎不在PHP的手中,你可以分配的最大值是多少还是1024M max?
  • 我们可以做一个4.5G的malloc()。我明白你的答案了吗?
  • 不,我的意思是,根据您自己使用 .htaccess 或 ini_set() 设置内存的测试,您尝试过的“坚持”的最高值是多少?
  • 好吧,这可能是 Suhosin 在该服务器上所做的事情。这里提到过:stackoverflow.com/questions/5859994/…
【解决方案2】:

我遇到了同样的问题,我需要我的 PHP 脚本来使用 4 GB 的 RAM。原因并不重要。目标是在 PHP 中设置 4 GB 的限制。

最初的想法是使用ini_set('memory_limit', '4096M');,但我发现这不起作用。我不知道如何或为什么要诚实,但这对当时的我来说并不重要。我在一个具有 32 GB 内存的系统上,它必须是可能的。

我发现将限制设置为少 1 MB 确实有效,这是一个对我有用的解决方案。

ini_set('memory_limit', '4095M'); // 4 GBs minus 1 MB

实际上,我以前从未真正玩过它,但我注意到在我的系统上,这个值似乎完全消除了我的所有内存限制。我可以使用我的系统可能提供的尽可能多的 RAM。

【讨论】:

  • 你知道为什么 4096mb 不工作了吗?它发生在我的 php 7 上。这个“错误”(如果是错误,则为 idk)在页面上没有显示任何内容,也没有错误。我也放了error_reporting。
  • 我也刚刚在 php 7.1 中遇到了这个错误。一旦我将它设置为 4095M,它就又开始工作了。假设这是用于 CLI 的,在需要大于 4GB 内存的情况下,最好将其设置为 -1。
  • 这个值释放memory_limit的原因是该值应该是整数,在32b PHP版本上限制为2^31(2G),无论你在64b操作系统上运行它。任何更大的都存储为浮点数(IEEE754 格式)并重新解释为整数(LE 或 BE,取决于架构)。如果它恰好低于零,它会释放限制。它以一种或另一种方式导致未定义的行为。
【解决方案3】:
ini_set("memory_limit",-1);

这通常会消除限制

【讨论】:

  • 设置一个负值(-1)意味着它可以根据所用机器的实际内存容量占用尽可能多的空间
  • 这在实际生产环境中是一种非常糟糕的做法。
  • 限制的存在是有充分理由的。如果您想要更长的答案,这里有一个快速答案:stackoverflow.com/a/10151831/1289283。无论如何,作为一名程序员,你的工作不仅是“让它发挥作用”,而且要尽可能有效地使用你的资源。像这样消除代码中的限制绝不是一个好习惯。一个好的做法是找到瓶颈并解决它。
  • @Kaymaz:所以你把它当作一个流来阅读,而不是全部在一个大块中。
  • "会出什么问题?" - 第二天晚上你的客户打电话给你,因为他的服务器死了。事实证明,一个移除了限制的脚本被并行调用了几百次,触发了内核 OOM 杀手,它杀死了 MySQL、SSH 和其他一些重要服务。限制是有充分理由的。
【解决方案4】:

Hardened-PHP - Configuration 中所述,Suhosin 不会让您设置大于脚本开始时的值

如果您将 suhosin.memory_limit 设置为 2048M,那么您将能够增加内存使用量。

【讨论】:

    【解决方案5】:

    极限

    ini_set('memory_limit', '4095M'); // 4 GBs minus 1 MB
    

    操作系统(OS)有关。对于 32 位操作系统,您必须使用此最大限制。

    我今天使用此解决方法解决了 memory_limit 的问题。

    使用更高的限制,PHP 会出现奇怪的行为。当一个类被实例化时,它会在一些公共非静态方法类中返回耗尽的内存,但在 __construct 方法中放置一个 die() (以测试问题)。

    【讨论】:

    • 为了澄清,请参阅我对 nxasdf 答案的评论。
    猜你喜欢
    • 2017-03-29
    • 2010-12-13
    • 2018-06-16
    • 2019-06-10
    • 1970-01-01
    • 2016-07-06
    • 1970-01-01
    • 2012-09-13
    • 2012-07-20
    相关资源
    最近更新 更多