PHP memory_get_peak_usage和ini_set('memory_limit','-1')的含义是什么?

5
我最近遇到了内存分配问题,所以我开始尝试使用ini_set('memory_limit', value);指令进行实验,并逐步增加值。现在,在网上(和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个回答

2
这是因为suhosin补丁使用自己的“硬”最大内存限制,suhosin.memory_limit
从配置参考中可以看到:

Suhosin [...] 当该选项保持为0时,禁止将memory_limit设置为比脚本启动时更大的值。

换句话说,如果您将memory_limit更改为大于suhosin的上限,则它会认为您是一个“攻击者”,试图执行可疑操作。

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!"
}
?>

0

你可能使用了10MB的内存,但是通过将value设置为-1,你允许你的脚本使用最大可用内存,比如说4GB


0

使用ini_set('memory_limit', '-1');不会为脚本设置限制 - 当然它仍然受到硬件的限制,但是从手册中可以看出;

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

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

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


0

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

Suhosin不允许您设置比脚本启动时更大的值。

如果您将suhosin.memory_limit设置为4096,则可以增加内存使用量而不会收到此警报

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

希望这回答了您的疑问


0
$mem / 1024 / 10124

应该是

$mem / 1024 / 1024

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

然后4,294,967,295 = 4 GB。我想这就是你拥有的全部(即-1)。

这意味着这些输出消息彼此无关。如果您想要警告消失,请将Suhosin内存限制设置为高于PHP内存限制或禁用Suhosin。

Suhosin有一个模拟模式,似乎是ON。如果将其关闭OFF,则警报应该停止脚本。


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