PHP:设置 memory_limits > 1024M 不起作用

Posted

技术标签:

【中文标题】PHP:设置 memory_limits > 1024M 不起作用【英文标题】:PHP: settings memory_limits > 1024M does not work 【发布时间】: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.ini 的更改生效是一个常见问题解答。规范问题在哪里?相关:Where can I find php.ini?How can I find the php.ini file used by the command line?How can I know which 'php.ini' file is used?php.ini changes, but not effective on Ubuntu 【参考方案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 在该服务器上所做的事情。这里提到过:***.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)意味着它可以根据所用机器的实际内存容量占用尽可能多的空间 这在实际生产环境中是一种非常糟糕的做法。 限制的存在是有充分理由的。如果您想要更长的答案,这里有一个快速答案:***.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 答案的评论。

以上是关于PHP:设置 memory_limits > 1024M 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

如何修改PHP的memory_limit限制

Php中 readfile() 文件大小如何设置?

memory_limit的一个bug | 风雪之隅

PHP修改memory_limit的三种办法

php书写不规范Notice: Use of undefined constant memory_limit

MacOS Laravel Valet 增加 memory_limit