我不知道是否正確。我有一個這樣的內容的PHP文件:foreach count在PHP中有限制嗎?
$x = explode("\n", $y); // Making $x has length 65000
foreach ($x as $k) {
//Some code here
}
而且經常我的腳本自動停止〜25000循環後。 爲什麼?它是PHP的默認配置?
我不知道是否正確。我有一個這樣的內容的PHP文件:foreach count在PHP中有限制嗎?
$x = explode("\n", $y); // Making $x has length 65000
foreach ($x as $k) {
//Some code here
}
而且經常我的腳本自動停止〜25000循環後。 爲什麼?它是PHP的默認配置?
此行爲可能是因爲兩個原因
腳本執行時間比分配給它更多...嘗試在php.ini增加max_execution_time
。
腳本的存儲器限制可以是多於分配。爲此嘗試在php.ini
我的評論的好副本;)。 +1 tho:P – 2013-03-31 10:17:27
@Allendar lolz ..但事實是這是問題的解決方案...所以我沒有其他答案...以及感謝我介紹新的PHP函數memory_get_usage()...我已經聽到它,但從未使用它 – alwaysLearn
Truetrue:D。很高興我們都從「問題」和「StackOverflow上的答案」中學習:) – 2013-03-31 10:27:37
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
這樣就可以提高你的極限,你想要的方式。這不適用於在線主機,除非你有專門的服務器。如果你不知道你在做什麼,這是非常危險的。無限循環會在您的瀏覽器甚至操作系統開始缺少內存/資源時崩潰。
改變 memory_limit
值。在foreach循環,該陣列通過作爲參考。在PHP中,foreach在數組開始循環之前創建一個數組副本。因此,如果你有一個100K的數組,那麼foreach將至少分配另一個100K進行處理。通過傳遞它作爲參考,您只關心地址的大小。
只有在PHP達到其內存限制或超時時纔會中止。您的腳本需要多長時間,需要多少內存? (http://www.php.net/function.memory-get-usage.php) – 2013-03-31 10:02:29
嗯我看到了,我會去嘗試取消設置非循環中使用變量 – user2228956