我有下面的递归函数,它可以工作...直到某一时刻。然后,一旦查询超过大约100次,脚本就会要求更多内存,当我添加更多内存时,脚本通常就会死掉(我最终在浏览器上看到一个白屏)。
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++;
}有没有人能帮我降低这个查询的资源消耗?或者想办法在两次调用之间释放内存...不知何故。
发布于 2010-05-29 00:53:38
白屏可能是因为堆栈溢出。你有一行parent_id是它自己的id吗?尝试将AND id != '".(int)$parent."'添加到where子句中,以防止此类错误潜入...
**EDIT:要考虑循环引用,请尝试将赋值修改为类似以下内容:
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));
}发布于 2010-05-29 00:53:53
你不应该在某个时刻停止递归吗(我猜如果行数为0,你确实需要从方法返回)?从您发布的代码中,我看到了对returnPArray的无休止的递归调用。
发布于 2010-05-29 00:55:01
让我问你..。你只是想构建一个页面树吗?如果是这样的话,在层次结构中是否存在可以称为终极父级的点?我发现,当在db中存储树时,除了直接父id之外,还存储最终的父id,这会使返回速度更快,因为您不需要对db进行任何递归或迭代。
这是一点反规格化,但只是一小部分,反规格化要比递归或迭代db要好。
如果您的需求更复杂,最好检索比所需更多的树,并使用应用程序代码遍历以获得所需的节点/行。大多数应用程序代码在迭代/递归时都远远优于任何DB。
https://stackoverflow.com/questions/2930851
复制相似问题