导致致命错误的递归菜单:允许的内存大小耗尽

时间:2013-10-23 02:03:40

标签: php recursion tree infinite-loop recursive-query

我不确定这里发生了什么,我在localhost上测试了这段代码,但现在我已经尝试上线了,我收到了这条错误消息:

致命错误:第24行的... / functions / tree.php中允许的内存大小为67108864字节(尝试分配261900字节)

我猜测代码导致某种无限递归但我有点困惑,因为它在localhost上工作正常。我花了几天的时间试图让它按照我喜欢的方式运行,我不愿意在没有方向的情况下改变一切。关于可能导致此错误和/或如何修复错误的想法?

<?php
function hasChild($parent_id)
{
  $sql = "SELECT COUNT(*) as count FROM categories WHERE parent = '" . $parent_id . "'";
  $qry = mysql_query($sql);
  $rs = mysql_fetch_array($qry);
  return $rs['count'];
}

function CategoryTree($list,$parent,$append)
{

  $list = '<li>'.'<a href="inventory.php?cid=' . $parent['id'] . '&cname=' . $parent['cname'] . '">' . $parent['cname'] . '</a>'.'</li>';


  if (hasChild($parent['id'])) // check if the id has a child
  {
    $append++;
    $list .= "<ul class='child child".$append."'>";
    $sql = "SELECT * FROM categories WHERE parent = '" . $parent['id'] . "'";
    $qry = mysql_query($sql);
    $child = mysql_fetch_array($qry);
    do{
      $list .= CategoryTree($list,$child,$append); //this is line 24
    }while($child = mysql_fetch_array($qry));
    $list .= "</ul>";
  }
  return $list;
}
function CategoryList()
{
  $list = "";

  $sql = "SELECT * FROM categories WHERE (parent = 0 OR parent IS NULL)";
  $qry = mysql_query($sql);
  $parent = mysql_fetch_array($qry);
  $mainlist = "<ul class='parent'>";
  do{
    $mainlist .= CategoryTree($list,$parent,$append = 0);
  }while($parent = mysql_fetch_array($qry));
  $list .= "</ul>";
  return $mainlist;
}
?>

2 个答案:

答案 0 :(得分:0)

Localhost设置可能与您的PHP服务器不同。 如果您的PHP服务器没有足够的内存,那么PHP将停止并显示该错误。

您需要增加允许的最大内存大小,您可以通过在脚本顶部添加以下内容来解决此问题:

ini_set('memory_limit', '128M');

或者如果您不想触摸代码,则可以在php.ini设置文件中进行设置。

答案 1 :(得分:0)

您正在收集大量字符串数据。我会考虑重构我的代码以更频繁地输出$ list和$ mainlist的内容。我尝试将代码设置为每次迭代通过循环输出一次。

此外,在输出HTML标签时,我通常会输出每个逻辑标签行,即在实际HTML文档中出现的情况。如果我必须查看源代码以确定输出是什么样的,那么这也增加了输出的可读性。