首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >递归的MySQL函数调用占用了太多的内存而死了

问递归的MySQL函数调用占用了太多的内存而死了
EN

Stack Overflow用户
提问于 2010-05-29 00:43:46
回答 7查看 1.3K关注 0票数 3

我有下面的递归函数,它可以工作...直到某一时刻。然后,一旦查询超过大约100次,脚本就会要求更多内存,当我添加更多内存时,脚本通常就会死掉(我最终在浏览器上看到一个白屏)。

代码语言:javascript
复制
public function returnPArray($parent=0,$depth=0,$orderBy = 'showOrder ASC'){



    $query = mysql_query("SELECT *, UNIX_TIMESTAMP(lastDate) AS whenTime 
        FROM these_pages 
        WHERE parent = '".$parent."' AND deleted = 'N' ORDER BY ".$orderBy."");

    $rows = mysql_num_rows($query);

    while($row = mysql_fetch_assoc($query)){

        // This uses my class and places the content in an array.
        MyClass::$_navArray[] = array(

            'id' => $row['id'], 
            'parent' => $row['parent']

        );

        MyClass::returnPArray($row['id'],($depth+1));   

    }
    $i++;

}

有没有人能帮我降低这个查询的资源消耗?或者想办法在两次调用之间释放内存...不知何故。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-05-29 00:53:38

白屏可能是因为堆栈溢出。你有一行parent_id是它自己的id吗?尝试将AND id != '".(int)$parent."'添加到where子句中,以防止此类错误潜入...

**EDIT:要考虑循环引用,请尝试将赋值修改为类似以下内容:

代码语言:javascript
复制
while($row = mysql_fetch_assoc($query)){
    if (isset(MyClass::$_navArray[$row['id']])) continue;

    MyClass::$_navArray[$row['id']] = array(
        'id' => $row['id'], 
        'parent' => $row['parent']
    );
    MyClass::returnPArray($row['id'],($depth+1));
}
票数 1
EN

Stack Overflow用户

发布于 2010-05-29 00:53:53

你不应该在某个时刻停止递归吗(我猜如果行数为0,你确实需要从方法返回)?从您发布的代码中,我看到了对returnPArray的无休止的递归调用。

票数 0
EN

Stack Overflow用户

发布于 2010-05-29 00:55:01

让我问你..。你只是想构建一个页面树吗?如果是这样的话,在层次结构中是否存在可以称为终极父级的点?我发现,当在db中存储树时,除了直接父id之外,还存储最终的父id,这会使返回速度更快,因为您不需要对db进行任何递归或迭代。

这是一点反规格化,但只是一小部分,反规格化要比递归或迭代db要好。

如果您的需求更复杂,最好检索比所需更多的树,并使用应用程序代码遍历以获得所需的节点/行。大多数应用程序代码在迭代/递归时都远远优于任何DB。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2930851

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档