2013-06-19 105 views
0

我有一個遞歸函數,給定一個id,建立一個目錄路徑。 問題是,它沒有釋放空間,因此從1761文件夾後15MB的內存消耗開始,內存消耗約爲150MB,這是不健康的。PHP:內存泄漏遞歸函數

這是功能:

private function buildDirectoryPath($iId, $sDir = "") 
{  
    $oFolder = Folders::getFolder($iId); 

    if (!empty($sDir)) $sDir = $oFolder->getName() . "/" . $sDir; 
     else $sDir = $oFolder->getName(). $sDir; 

    if ($oFolder->getParentId() > 0) 
     $sDir = $this->buildDirectoryPath($oFolder->getParentId(), $sDir); 

    return $sDir; 
} 

,這是我如何稱呼它(文件夾的內循環):

foreach ($aFolders as $aFolder) {   
    $sFolderPath = $this->buildDirectoryPath($aFolder["fol_id"]); 
} 

所以說實話,我沒有寫很多遞歸函數,所以我願意接受任何調整

編輯,添加文件夾::的GetFolder靜態方法:

static public function getFolders($sAppCode, 
             $iParentId = 0) 
    { 

     $oDb = Zend_Registry::get('db'); 
     $oSelect = $oDb 
      ->select() 
      ->from('folders') 
      ->where('folders.fol_deleted_user_id = 0') 
      ->order('folders.fol_name ASC'); 


     if ($iParentId >= 0) { 
      $oSelect->where('folders.fol_parent_id = ' . (int)$iParentId); 
     } 

     $aFolders = $oDb->fetchAll($oSelect); 

//added the $object = null later 

     $oDb = null; 
     $oSelect = null; 
     $oAppSelector = null; 
     return $aFolders; 
    } 

edit2:如果我找不到一個簡單的解決方案,我的計劃b將緩存路徑,所以我不需要建立他們的一切。它只是我必須改變應用程序內的很多代碼

+0

如果您未設置($ oFolder),它會有幫助嗎?返回之前? –

+0

多數民衆贊成說,我已經嘗試過,不幸的是它不起作用 –

+1

然後它看起來像你的泄漏是在你的'文件夾'類 –

回答

0

爲什麼不使用RecursiveDirectoryIteratorDirectoryIterator進行文件夾解析?

您的代碼非常殘缺。我們需要看看在這之外發生了什麼。將數據存儲在數組中的位置或者可以佔用內存的位置。如果您在2000個文件夾中構建文件樹,則150MB非常合理。

+0

我正在做一個數據庫,而不是在實際的文件系統 –