我有一个递归函数,给定一个id,构建一个目录路径。 问题是,它没有释放空间,所以从1761文件夹后的内存消耗开始,内存消耗大约为150MB,这是不健康的。
这是功能:
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就是将缓存放在路径上,所以我不需要为它们构建所有东西。它只是我必须改变应用程序内的许多代码
答案 0 :(得分:0)
为什么不使用RecursiveDirectoryIterator
或DirectoryIterator
进行文件夹解析?
您的代码非常不完整。我们需要看看除此之外会发生什么。将数据存储在数组中的位置或者您执行的操作可能会占用内存。如果你在2000个文件夹中构建一个文件树,150MB是非常合理的。