PHP:递归函数存在内存泄漏


PHP: Memory leak in recursive function

我有一个递归函数,给定一个id,它构建一个目录路径。问题是,它没有释放空间,所以在1761个文件夹之后,内存消耗为15MB,内存消耗约为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是把路径缓存,所以我不需要建立他们所有的东西。只是我需要修改应用程序中的很多代码

为什么不使用 RecursiveDirectoryIterator DirectoryIterator 进行文件夹解析?

你的代码很不完整。我们得看看外面会发生什么。你在数组中存储数据的地方或者你做的事情会占用内存。如果在2000个文件夹中构建一个文件树,150MB是非常合理的。