2016-05-14 38 views
0

我有一個處理大型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對象,我有一個運行時的緩存,它保存了一些基本選擇查詢的結果在一個數組,以便快速訪問後來,這是腳本中唯一的變量(我知道的),它在整個腳本中的大小都增加了,所以我試着轉動這個選項,內存使用量下降了,但只有一點點,但仍然是。在整個腳本上升

我的問題有以下幾點:

  1. 在長時間運行的腳本中,內存使用緩慢上升是否是php中的正常行爲,或者我應該搜索整個代碼,並嘗試找出什麼東西在吃掉我的記憶?

  2. 我知道,通過對一個變量使用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); 
+1

Block1和Block2將具有相同的內存使用率,但由於未設置和重新創建$ var –

+2

,因此可能會導致block2的運行速度變慢,因爲可能會在整個長時間運行的腳本中緩慢增加內存使用量,但會導致內存緩慢上升在一個循環內使用一個長時間運行的腳本'是很少見的,除非這個循環正在構建一個數組或類似的東西......它看起來像你的循環內部的東西正在消耗內存並且不會釋放它 –

+0

嗯,這正是我所關心的。在這種情況下,我需要逐個調試,循環使用的每個函數:| –

回答

0

如果安裝在開發機器上的XDebug的模塊,你可以得到它做一個函數軌跡 - 這將顯示內存每條線的用法 - https://xdebug.org/docs/execution_trace

這可能會有所幫助您可以確定空間正在上升的位置 - 然後您可以嘗試取消設置($ var)等,看看它是否有任何區別。