我最近遇到了内存分配问题,所以我开始尝试使用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
并不建议,我知道问题出在哪里(在内存中一次读取过多的数据),我会通过顺序阅读来修复它,但我对这些数据差异感到困惑,所以如果有人能够对它有所了解,我将不胜感激。
答案 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应该停止脚本。