[recursion] “치명적 오류 : 최대 기능 중첩 수준 ‘100’에 도달했습니다. 중단되었습니다!” PHP에서

html 파일 내에서 모든 URL을 찾고 검색 된 URL에 연결된 각 html 컨텐츠에 대해 동일한 프로세스를 반복하는 기능을 만들었습니다. 이 함수는 재귀 적이며 끝없이 진행될 수 있습니다. 그러나 100 회 재귀 후 재귀가 중지되도록 전역 변수를 설정하여 재귀를 제한했습니다.

그러나 PHP는 다음 오류를 반환합니다.

치명적인 오류 : 최대 기능 중첩 수준 ‘100’에 도달하여 중단되었습니다! D : \ wamp \ www \ crawler1 \ simplehtmldom_1_5 \ simple_html_dom.php의 1355 행

오류

여기에서 해결책을 찾았습니다 : 중첩 함수 호출 제한을 늘리지 만 제 경우에는 작동하지 않습니다.

위에서 언급 한 링크에서 답변 중 하나를 인용하고 있습니다. 그것을 고려하십시오.

“Zend, IonCube 또는 xDebug가 설치되어 있습니까? 그렇다면이 오류가 발생했을 수 있습니다.

몇 년 전에이 문제가 발생하여 PHP가 아닌 Zend가 그 한계를 뛰어 넘었습니다. 물론 이것을 제거하면 100 번의 반복을 지나갈 수 있지만 결국 메모리 한계에 도달하게됩니다. “

PHP에서 최대 함수 중첩 수준을 높이는 방법이 있습니까?



답변

의 가치를 높이 xdebug.max_nesting_level십시오php.ini


답변

간단한 해결책으로 문제가 해결되었습니다. 방금이 줄을 주석 처리했습니다.

zend_extension = "d:/wamp/bin/php/php5.3.8/zend_ext/php_xdebug-2.1.2-5.3-vc9.dll

php.ini 파일에. 이 확장은 스택을 제한하여 100비활성화했습니다. 재귀 함수는 이제 예상대로 작동합니다.


답변

재귀 함수 호출을 수행하는 대신 큐 모델을 사용하여 구조를 평탄화하십시오.

$queue = array('http://example.com/first/url');
while (count($queue)) {
    $url = array_shift($queue);

    $queue = array_merge($queue, find_urls($url));
}

function find_urls($url)
{
    $urls = array();

    // Some logic filling the variable

    return $urls;
}

그것을 처리하는 다른 방법이 있습니다. 통과 한 원점이나 경로에 대한 통찰력이 필요한 경우 자세한 정보를 추적 할 수 있습니다. 유사한 모델을 해결할 수있는 분산 큐도 있습니다.


답변

또 다른 해결책은 xdebug.max_nesting_level = 200php.ini 에 추가 하는 것입니다


답변

xdebug를 비활성화하는 대신 다음과 같이 더 높은 한계를 설정할 수 있습니다

xdebug.max_nesting_level = 500


답변

예를 들어 프로젝트의 구성 파일과 같이 PHP에서 직접 수정할 수도 있습니다.

ini_set('xdebug.max_nesting_level', 200);


답변

php.ini 구성 파일로 이동하여 다음 줄을 변경하십시오.

xdebug.max_nesting_level=100

같은 것 :

xdebug.max_nesting_level=200