PHP:递归函数中的内存泄漏

PHP:递归函数中的内存泄漏,php,memory,recursion,memory-leaks,Php,Memory,Recursion,Memory Leaks,我有一个递归函数,给定一个id,它建立一个目录路径。 问题是,它不会释放空间,因此从1761个文件夹之后的15MB内存消耗开始,内存消耗大约为150MB,这是不健康的 这就是功能: private function buildDirectoryPath($iId, $sDir = "") { $oFolder = Folders::getFolder($iId); if (!empty($sDir)) $sDir = $oFolder->getName() .

我有一个递归函数,给定一个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;
}
我这样称呼它(在文件夹的循环中):

老实说,我还没有写过很多递归函数,所以我愿意接受任何调整

编辑,添加文件夹::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计划是缓存路径,所以我不需要构建所有路径。只是我必须修改应用程序中的许多代码,为什么不使用或进行文件夹解析


你的代码很不完整。我们需要看看外面会发生什么。在数组中存储数据的位置,或执行可能占用内存的操作。若你们在2000个文件夹中建立一个文件树,那个么150MB是非常合理的。

若你们取消设置($oFolder);在返回之前?这是我已经尝试过的一件事,不幸的是它不起作用。那么看起来你的漏洞在你的
文件夹中
$oFolder=null
unset()
不会立即释放内存$var=null;也不行。我正在使用zend检索数据库值,这可能是罪魁祸首吗?添加了静态方法我是在数据库中进行的,而不是在实际的文件系统上
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;
    }