【问题标题】:PHP: Memory leak in recursive functionPHP:递归函数中的内存泄漏
【发布时间】:2013-06-15 19:46:40
【问题描述】:

我有一个递归函数,给定一个 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 将缓存路径,所以我不需要构建它们所有的东西。只是我必须在应用程序中更改很多代码

【问题讨论】:

  • unset($oFolder); 有帮助吗?回来之前?
  • 这是我已经尝试过的一件事,不幸的是它不起作用
  • 那么看起来你的泄漏在你的Folders类中
  • $oFolder=null; 怎么样,unset() 不会立即释放内存。 stackoverflow.com/questions/584960/…
  • $var = null;也不起作用。我正在使用 zend 检索数据库值,这可能是罪魁祸首吗?添加了静态方法

标签: php memory recursion memory-leaks


【解决方案1】:

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

您的代码非常不完整。我们需要看看在这之外会发生什么。将数据存储在数组中的位置或执行操作会占用内存。如果您在 2000 个文件夹中构建文件树,则 150MB 是非常合理的。

【讨论】:

  • 我是在数据库中做的,而不是在实际的文件系统上
猜你喜欢
  • 2012-10-31
  • 2012-08-31
  • 1970-01-01
  • 2021-07-11
  • 2017-05-09
  • 1970-01-01
  • 2016-03-15
  • 1970-01-01
  • 2014-12-21
相关资源
最近更新 更多