2013-10-23 1 views
0

내가 여기 무슨 일이 일어나고 있는지 확실하지 않다 소진, 나는 로컬 호스트에이 코드를 테스트하지만 지금 해봤 것을 내가이 오류 메시지를 받고 있어요 생중계 :재귀 메뉴 일으키는 치명적인 오류 : 허용 메모리 크기가

치명적 오류 : 사용 가능한 메모리 크기가 67108864 바이트 (261900 바이트를 할당하려고했습니다.) .../function/tree.php in 24 행

무한 재귀를 일으키는 일종의 코드를 추측하고 있지만 그것은 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; 
} 
?> 

답변

0

로컬 호스트 설정이 PHP 서버와 다를 수 있습니다. PHP 서버에 메모리가 충분하지 않으면 PHP가 그 오류로 인해 중지됩니다.

당신은 최대 허용 메모리 크기를 늘려야합니다, 당신은이를 추가하여 스크립트의 상단에 다음이 문제를 해결할 수 있습니다

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

또는 당신은 당신의 코드를 터치하지 않으려면 php.ini 설정 파일에서이 값을 설정할 수 있습니다.

+0

여전히 오류 메시지가 표시되지만 허용 된 크기가 더 크고 어떤 이유로 든 오류 줄이 21 행에 있습니다 ... 치명적인 오류 : 134217728 바이트의 메모리 크기가 소모되었습니다 (44 바이트 할당 시도)/기능 /tree.php on line 21 –

+0

그런 다음 '-1'로 설정하여 메모리 누수를주의하십시오 – meda

0

많은 양의 문자열 데이터를 수집 중입니다. 나는 $ list와 $ mainlist의 내용을 더 자주 출력하도록 내 코드를 리팩토링하는 것을 고려할 것이다. 루프를 통해 반복마다 한 번씩 출력하도록 내 코드를 설정하려고합니다.

또한 HTML 태그를 출력 할 때 일반적으로 모든 실제 태그 행을 출력합니다. 즉, 실제 HTML 문서에 표시되는 것처럼 나타납니다. 이것은 출력 결과를 알아 내기 위해 소스를보아야 만한다면 내 출력의 가독성을 높입니다.