我有一個處理大型XML文件的php腳本,並將它們的數據保存到數據庫中。在保存到數據庫之前,我使用幾個類來處理並將數據存儲在PHP腳本中,並逐個節點讀入XML以保留內存。 Basicaly,在我的文件中的循環是這樣的:這是正常的記憶行爲?
while ($Reader->read()) {
$parsed++;
if (time() >= $nexttick) {
$current=microtime(true)-$ses_start;
$eta=(($this->NumberOfAds-$parsed)*$current)/$parsed;
$nexttick=time()+3;
$mem_usage=memory_get_usage();
echo "Parsed $parsed @ $current secs \t | ";
echo " (mem_usage: " . $mem_usage . " \t | ";
echo "ETA: $eta secs\n";
}
$node=$Reader->getNode();
// OMMITED PART: $node is an array, I make some processing, and check if everything exists in the array that I need in the following section
$Ad=new Ad($node); // creating an Ad object from the node
// OMMITED PART: Making some additional SQL queries, to check the integrity of the data, before uploading it to the database
if (!$Ad->update()) {
//add wasn't inserted succesfully, saving a row in a second database table, to log this information
} else {
//add succesfully inserted, saving a row in a second database table, to log this information
}
}
您會注意到,該循環的第一部分,是一個小的輸出工具,輸出文件的進展情況,每3秒,並且還輸出腳本的內存使用情況。我需要這個,因爲我遇到了一個內存問題,最後一次我試圖上傳一個文件,並想弄清楚,什麼東西正在蠶食掉內存。
這個腳本的輸出看起來是這樣的,當我跑它:
解析的15 @ 2.0869598388672秒| (mem_usage:1569552 | ETA:1389.2195994059秒 解析的30 @ 5.2812438011169秒|(mem_usage:1903632 | ETA:1755.1333565712秒 解析的38 @ 8.4330480098724秒|(mem_usage:2077744 | ETA:2210.7901124829秒 解析的49 @ 11.377414941788秒|(mem_usage :2428624 | ETA:2310.5440017496秒 解析的59 @ 14.204828023911秒|(mem_usage:2649136 | ETA:2393.3931421304秒 解析的69 @ 17.032008886337秒|(mem_usage:2831408 | ETA:2451.3750760901秒 解析的79 @ 20.359696865082秒|(mem_usage:2968656 | ETA:2556.8171214997 secs Parsed 87 @ 23.053930997849 secs |(mem_usage:3102360 | ETA:2626.8231951916 secs Parsed 98 @ 26.148546934128 secs |(mem_usage:3285096 | ETA:2642.0705279769 sec s Parsed 107 @ 29.092607021332 secs | (mem_usage:3431944 | ETA:2689.8426286172秒
現在,我知道肯定,在我的MySQL
對象,我有一個運行時的緩存,它保存了一些基本選擇查詢的結果在一個數組,以便快速訪問後來,這是腳本中唯一的變量(我知道的),它在整個腳本中的大小都增加了,所以我試着轉動這個選項,內存使用量下降了,但只有一點點,但仍然是。在整個腳本上升
我的問題有以下幾點:
在長時間運行的腳本中,內存使用緩慢上升是否是php中的正常行爲,或者我應該搜索整個代碼,並嘗試找出什麼東西在吃掉我的記憶?
我知道,通過對一個變量使用
unset()
,我可以釋放它從記憶帶走的空間,但我需要使用unset()
即使我在整個文件覆蓋相同的變量?
我的第二個問題的輕微改述一個例子:
以下兩種碼塊產生相同的結果關於存儲器使用,或者如果沒有,哪一個更優化?
BLOCK1
$var = str_repeat("Hello", 4242);
$var = str_repeat("Good bye", 4242);
BLOCK2
$var = str_repeat("Hello", 4242);
unset($var);
$var = str_repeat("Good bye", 4242);
Block1和Block2將具有相同的內存使用率,但由於未設置和重新創建$ var –
,因此可能會導致block2的運行速度變慢,因爲可能會在整個長時間運行的腳本中緩慢增加內存使用量,但會導致內存緩慢上升在一個循環內使用一個長時間運行的腳本'是很少見的,除非這個循環正在構建一個數組或類似的東西......它看起來像你的循環內部的東西正在消耗內存並且不會釋放它 –
嗯,這正是我所關心的。在這種情況下,我需要逐個調試,循環使用的每個函數:| –