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

73

由于某些不好的原因,我需要将目录中的内存限制(memory_limits)设置为高于1 GB,但是在我的PHP 5.2.17上运行的Debian 5.0 (Lenny)服务器上,当我使用例如2048M时,我只得到了php.ini默认值(256M)。

PHP作为Apache模块运行,并且phpinfo为我们提供了(针对该目录):

memory_limit    1024M    256M
suhosin.memory_limit    0    0

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


3
我现在处于同样的情况。我非常理解"出于不好的原因"这句话! - Simon Arnold
让文件php.ini的更改生效是一个常见问题。哪里有规范的问题?相关:*我在哪里可以找到php.ini?如何找到命令行使用的php.ini文件?如何知道使用哪个'php.ini'文件?Ubuntu上的php.ini更改,但不起作用*。 - Peter Mortensen
5个回答

136

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

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

php_value memory_limit 2048M

由于关闭了用于设置PHP值的.htaccess命令,因此您也可以尝试从PHP代码中尝试以下操作:

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

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


2
我使用php_value或ini_set,但遇到同样的问题:如果我设置512M或1024M,那么一切正常;但如果我设置1500M或2048M,我只得到256Mo(即php.ini中的默认值)。 - Cédric Girard
1
在这种情况下,似乎超出了PHP的掌控范围,您可以分配的最大值是多少?还是1024M是最大值? - kingmaple
我们可以使用malloc()函数分配4.5G的内存。我理解了你的回答吗? - Cédric Girard
1
不,我的意思是,根据您使用 .htaccess 或 ini_set() 设置内存的测试,您尝试过的最高可用值是多少? - kingmaple
在这个服务器上,有1024M的内存。之后,它降到了256M。而在其他服务器上,则没有问题地拥有16384M的内存。 - Cédric Girard
1
这可能是Suhosin在该服务器上执行的某些操作。在这里已经提到了:https://dev59.com/3VbUa4cB1Zd3GeqPBsXU - kingmaple

38

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

最初的想法是使用 ini_set('memory_limit', '4096M');,但我发现它不起作用。说实话我不知道为什么,但那时对我来说并不重要。我使用32GB的RAM系统,这应该是可行的。

我发现将内存限制设置为比4GB低1MB实际上有效,并且这是适合我的解决方案。

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

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


你明白为什么4096MB不能工作吗?我在PHP 7上遇到了这个问题。这个“错误”(我不知道它是否是错误)既没有在页面上显示任何内容,也没有报错。我已经设置了error_reporting。 - Phoenix404
我也刚刚在php 7.1中遇到了这个bug。一旦我将它设置为4095M,它就重新开始工作了。假设这是用于CLI使用,也许在需要大于4GB的内存的情况下,最好将其设置为-1。 - rtd1123
1
释放 memory_limit 的原因是该值应为整数,在 32 位 PHP 版本中限制为 2^31(2G),无论您是否在 64 位操作系统上运行它。任何大于此值的内容都将以浮点数(IEEE754 格式)存储,并重新解释为整数(LE 或 BE,取决于架构)。如果它低于零,它会释放限制。不管怎样,这都会导致未定义的行为。 - Jan Turoň

30
ini_set("memory_limit",-1);

通常情况下,这应该会移除限制。


9
将一个负一的数值 (-1) 设定意味着它可以根据所使用的机器的实际内存容量而占用尽可能多的空间。 - Abel Callejo
23
在真实的生产环境中,这是非常糟糕的做法。 - walther
13
限制存在是有很好的原因的。如果您想要更详细的答案,可以查看此链接:https://dev59.com/QG855IYBdhLWcg3w5Igb#10151831 。总之,作为一个程序员,您的工作不仅是“让它工作”,而且要尽可能有效地利用资源。在代码中删除这样的限制从来都不是一个好习惯。一个好的做法是找到瓶颈并解决它。 - walther
1
@Kaymaz:所以你是将其作为流读取,而不是一次性读取所有内容。 - Ryan Parman
6
“what could go wrong?” - 第二天晚上,你的客户打电话来告诉你他的服务器崩溃了。原来,一个脚本被并行执行了几百次,触发了内核的OOM killer(内存不足杀手),导致MySQL、SSH和其他一些重要服务被终止。限制存在是有很好的理由的。 - Kaii
显示剩余2条评论

8

限制

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

此与 操作系统(OS)相关。在使用32位OS时,必须使用此最大限制。

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

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


请看我对nxasdf答案的评论以澄清。 - Jan Turoň

6
Hardened-PHP - 配置 中所述,Suhosin 不允许您将值设置为大于脚本启动时的值
如果您将suhosin.memory_limit设置为2048M,则可以增加内存使用率。

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