2012-11-21 83 views
4

我最近遇到內存分配問題,所以我開始嘗試使用ini_set('memory_limit', value);指令,我嘗試增量輸入值。現在,通過網絡搜索(和SO),我發現我可以把-1作爲value。所以,我做了,現在腳本完全運行到最後而沒有中斷(在我以前得到內存分配錯誤之前)。PHP memory_get_peak_usage和ini_set('memory_limit','-1')

我不明白,然而,就是在給腳本的文件的末尾兩行:

$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) 

這意味着腳本試圖alocate 4096MB

這怎麼可能?而且,我最感興趣的是爲什麼在這種情況下腳本執行沒有停止?是因爲ini_set('memory_limit', '-1');?我的意思是,我確實讀過,因爲value不是推薦的,我知道腳本中存在問題的位置(一次在內存中讀取大量數據),然後我將按順序讀取並修復它,但是我對這些數據差異感到困惑,所以如果有人能夠對此有所瞭解,我會感到非常滿意。

回答

2

正是因爲了Suhosin補丁都使用自己的 「硬」 最大內存限制,suhosin.memory_limit

從配置基準:

了Suhosin [...]不允許設置memory_limit的值比一個腳本開始,當該選項在0左大。

換句話說,如果你改變了memory_limit所以它比了Suhosin的上限更大然後它會簡單地認爲你是一個「黑客」試圖做一些可疑。

0

認爲您使用了10MB,但是通過將-1設置爲value您允許您的腳本使用可用的最大內存,例如4GB

0

使用ini_set('memory_limit', '-1');不會爲腳本設置限制 - 當然它仍然只限於硬件,但從手冊中;

注意,有沒有內存限制,設置這個指令爲-1

我什麼最感興趣的是爲什麼沒有在這種情況下,腳本執行停止?

該腳本沒有停止執行,因爲它未達到最大內存限制,因爲它設置爲-1

+0

請參閱http://stackoverflow.com/a/20753388/2013738 –

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

由於在這裏描述:http://www.hardened-php.net/suhosin/configuration.html#suhosin.memory_limit

了Suhosin不會讓你設置比一個腳本開始的值。

如果設置了suhosin.memory_limit到,那麼你就可以增加你的內存使用量沒有得到這個警報

我的猜測是劇本沒有嘗試分配4096MB但示出了32位系統在其上的PHP服務器正在運行的最大可尋址內存限制shuosin的其一個錯誤警報是2^32

希望這answe RS你的疑惑

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應停止腳本。