У меня есть рекурсивная функция, которая с учетом идентификатора создает путь к каталогу. Дело в том, что он не освобождает пространство, поэтому, начиная с потребления памяти 15 МБ после 1761 папок, потребление памяти составляет около 150 МБ, что не является здоровым.
это функция:
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"]); }
так что, честно говоря, я еще не написал много рекурсивных функций, поэтому я открыт для любых корректировок
изменить, добавив статический метод Folders :: 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 должен был бы поместить кеш пути, поэтому мне не нужно их создавать. его просто, что я должен изменить много кода внутри приложения