5

我最近遇到了内存分配问题,所以我开始ini_set('memory_limit', value);尝试尝试增量输入值的指令。现在,通过网络(和 SO)搜索,我发现我可以-1value. 所以,我做到了,现在脚本完全运行到最后而没有中断(在我曾经得到内存分配错误之前)。

但是,我不明白的是,鉴于脚本文件末尾的这两行:

$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不推荐,我知道问题出在脚本中(在内存中一次读取过多的数据),我会通过顺序读取来修复它,但我我只是对这些数据差异感到困惑,所以如果有人能对此有所了解,我将不胜感激。

4

6 回答 6

2

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

从配置参考:

当此选项保留为 0 时,Suhosin [...] 不允许将 设置为memory_limit大于脚本开头的值。

换句话说,如果您将 更改memory_limit为大于 suhosin 的上限,那么它将简单地假设您是一个试图做一些可疑事情的“攻击者”。

于 2013-12-21T09:28:36.407 回答
0

认为您使用了 10MB,但通过放置-1value允许您的脚本使用最大可用内存,例如4GB.

于 2012-11-22T09:49:05.553 回答
0

使用ini_set('memory_limit', '-1');不会对脚本设置限制——当然它仍然会限制在硬件上,但是来自手册;

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

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

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

于 2013-12-20T16:50:04.200 回答
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!"
}
?>
于 2013-12-21T09:10:25.680 回答
0

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

Suhosin 不允许您设置大于脚本开始时的值

如果您将suhosin.memory_limit设置为4096,那么您将能够增加内存使用量而不会收到此警报

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

希望这能解答你的疑惑

于 2013-12-23T13:06:01.817 回答
0
$mem / 1024 / 10124

应该

$mem / 1024 / 1024

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

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

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

Suhosin 有一个模拟模式,它似乎是ON。如果打开OFF,ALERT 应该停止脚本。

于 2013-12-24T00:51:48.047 回答