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 = 200
php.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