PHP memory_get_peak_usage和ini_set('memory_limit',' - 1')

时间:2012-11-21 14:20:57

标签: php memory-management memory-limit

我最近遇到了内存分配问题,所以我开始尝试使用ini_set('memory_limit', value);指令尝试输入值incrementaly。现在,通过网络搜索(以及SO),我发现我可以将-1作为value。所以,我做了,现在脚本完全运行到最后而不会中断(在我以前得到内存分配错误之前)。

然而,我不明白的是,在脚本文件的末尾给出了这两行:

$mem = memory_get_peak_usage(true);         
echo "Peak mem. usage: <b>" . round($mem / 1024 / 10124, 2) . "</b> MB";

产生 10.8MB ,当我查看/var/log/messages时,我可以看到这一行:

Nov 21 13:52:26 mail suhosin[1153]: ALERT-SIMULATION - script tried to increase  
memory_limit to 4294967295 bytes which is above the allowed value (attacker  
'xx.xxx.xxx.xxx', file '/var/www/html/file.php', line 5)

这意味着该脚本试图分配 4096MB

这怎么可能?而且,最让我感兴趣的是为什么在这种情况下脚本执行没有停止?是因为ini_set('memory_limit', '-1');吗?我的意思是,我确实读过将-1作为value并不建议,我知道问题出在哪里(在内存中一次读取过多的数据),我会通过顺序阅读来修复它,但我对这些数据差异感到困惑,所以如果有人能够对它有所了解,我将不胜感激。

6 个答案:

答案 0 :(得分:2)

这是因为suhosin补丁使用自己的“硬”最大内存限制suhosin.memory_limit

从配置参考:

  

当此选项保留为0时,Suhosin [...]禁止将memory_limit设置为大于脚本的值

换句话说,如果你更改memory_limit以使它大于suhosin的上限,那么它只会假设你是一个试图做可疑事情的“攻击者”。

答案 1 :(得分:0)

认为您使用了10MB,但是将-1作为value,您允许您的脚本使用可用的最大内存,例如4GB

答案 2 :(得分:0)

使用ini_set('memory_limit', '-1');不会为脚本设置限制 - 当然它仍然仅限于硬件,但来自手册;

  

请注意,要没有内存限制,请将此指令设置为-1

我最感兴趣的是为什么在这种情况下脚本执行没有停止?

脚本没有停止执行,因为它没有达到最大内存限制,因为它设置为-1

答案 3 :(得分:0)

memory_get_peak_usage - 返回PHP分配的内存峰值。

memory_limit - 增加最大内存分配

<?php 
if(ini_set('memory_limit', '-1'))
{
    echo "memory_limit set to -1B";
}
else
{
    echo "ini_set() failed!"
}
?>

答案 4 :(得分:0)

如此处所述:http://www.hardened-php.net/suhosin/configuration.html#suhosin.memory_limit

Suhosin不会让你设置的值大于脚本以开头的值。

如果您将 suhosin.memory_limit 设置为 4096 ,那么您将能够在不获取此警报的情况下增加内存使用量

我的猜测是脚本没有尝试分配 4096MB ,但它是一个错误的shuosin警告,显示 32位系统的最大可寻址内存限制 php服务器正在运行 2 ^ 32

希望这能解答你的怀疑

答案 5 :(得分:0)

$mem / 1024 / 10124

应该是

$mem / 1024 / 1024

所以我们正在谈论一个100 MB的峰值。

然后4,294,967,295 = 4 GB。我想你只有-1

这意味着这些输出消息彼此无关。如果您希望警告消失,set the Suhosin memory limit高于PHP内存限制或禁用Suhosin。

Suhosin的simulation mode似乎是ON。如果转为OFF,则ALERT应该停止脚本。