2013-03-31 26 views
0

我不知道是否正確。我有一個這樣的內容的PHP文件:foreach count在PHP中有限制嗎?

$x = explode("\n", $y); // Making $x has length 65000 
foreach ($x as $k) { 
    //Some code here 
} 

而且經常我的腳本自動停止〜25000循環後。 爲什麼?它是PHP的默認配置?

+2

只有在PHP達到其內存限制或超時時纔會中止。您的腳本需要多長時間,需要多少內存? (http://www.php.net/function.memory-get-usage.php) – 2013-03-31 10:02:29

+0

嗯我看到了,我會去嘗試取消設置非循環中使用變量 – user2228956

回答

3

此行爲可能是因爲兩個原因

  1. 腳本執行時間比分配給它更多...嘗試在php.ini增加max_execution_time

  2. 腳本的存儲器限制可以是多於分配。爲此嘗試在php.ini

+0

我的評論的好副本;)。 +1 tho:P – 2013-03-31 10:17:27

+0

@Allendar lolz ..但事實是這是問題的解決方案...所以我沒有其他答案...以及感謝我介紹新的PHP函數memory_get_usage()...我已經聽到它,但從未使用它 – alwaysLearn

+0

Truetrue:D。很高興我們都從「問題」和「StackOverflow上的答案」中學習:) – 2013-03-31 10:27:37

1

PHP的默認內存限制是8MB(我的意思是標準發行版,不是源代碼中的默認PHP編譯,因爲這是無限的)。

當我這樣做代碼:

$x = array(); 

for ($i = 0; $i < 65000; $i++) { 
    $x[$i] = $i; 
} 


echo (memory_get_peak_usage()/1024).'<br />'; 
echo (memory_get_usage()/1024).'<br />'; 
echo count($x); 

它輸出:

9421.9375 
9415.875 
65000 

爲了測試這一點,我增加了我的內存限制壽。但如果你不能分配更多的內存,它會中止一個錯誤。

for ($i = 0; $i < 1e6; $i++) { // 1 Million 
    $x[$i] = $i; 
} 

它報告回來;

Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 32 bytes) in /Applications/MAMP/htdocs/run_app.php on line 5 

對於個人用途(我有16GB的RAM,所以它是沒有問題)我使用這些代碼開始:

// Settings 
ini_set('error_reporting', E_ALL); // Shows all feedback from the parser for debugging 
ini_set('max_execution_time', 0); // Changes the 30 seconds parser exit to infinite 
ini_set('memory_limit', '2048M'); // Sets the memory that may be used to 512MegaBytes 

這樣就可以提高你的極限,你想要的方式。這不適用於在線主機,除非你有專門的服務器。如果你不知道你在做什麼,這是非常危險的。無限循環會在您的瀏覽器甚至操作系統開始缺少內存/資源時崩潰。

0

改變 memory_limit值。在foreach循環,該陣列通過作爲參考。在PHP中,foreach在數組開始循環之前創建一個數組副本。因此,如果你有一個100K的數組,那麼foreach將至少分配另一個100K進行處理。通過傳遞它作爲參考,您只關心地址的大小。