중첩 함수 호출 한계 증가


127

PHP에는 한 가지 매우 나쁜 한계가 있습니다. a2 ()를 호출하는 a1 () 함수를 호출하면 a3 a99()을 호출 a100()합니다.

치명적인 오류 : 최대 기능 중첩 수준 '100'에 도달하여 중단되었습니다!

100 회의 중첩 호출 제한을 500 또는 10000으로 늘릴 수있는 방법이 있습니까?

콜백이 많은 이벤트 기반 시스템을 개발하고 있기 때문에 이것은 중요합니다.


12
이벤트 프레임 워크의 경우에도 100이 약간 과도하게 보입니다.
Ignacio Vazquez-Abrams

7
@Ignacio : 포커스가 이벤트 프레임 워크에 있어도 훨씬 높은 중첩 수준을 필요로하는 재귀 함수를 갖는 것은 매우 간단합니다. 그러한 시나리오에서는 수만 (또는 수백만)이 드물지 않습니다.
Abel

stackoverflow.com/a/36440027/2652524 난 내이 대답을 사용하여 해결
구자라트 산타나를

답변:


254

이 오류 메시지는 특히 XDebug 확장에서 발생합니다. PHP 자체에는 함수 중첩 제한이 없습니다. php.ini 에서 설정 을 변경 하십시오 :

xdebug.max_nesting_level = 200

또는 PHP 코드에서 :

ini_set('xdebug.max_nesting_level', 200);

실제로 변경 해야하는 경우 (예 : 재귀 함수에 대한 대안 솔루션이있는 경우) 코드없이 말할 수 없습니다.


나는 같은 문제가 있었다. 내 max_nesting_level은 100으로 설정되었지만 제 경우에는 1000 회귀 호출을 할 수 있습니다. 따라서이 xdebug 오류를 피하기 위해 10000으로 설정했습니다. 모든 경우에 항상 제한없이 PHP를 사용하는 것보다 낫습니다.
SkaJess

9
php.ini 에이 xdebug.max_nesting_level = 100옵션 이 없다면 그냥 붙여 넣기 만하면됩니다.
M. Reza Nasirloo

@Pedram PHP ini 파일에 복사하는 올바른 방법은 일반적인 php.ini가 아닌 /etc/php5/apache2/conf.d/20-xdebug.ini에 있습니다. 좋은 연습
Enrique Quero

3
@EnriqueQuero 시스템 및 OS에 따라 다릅니다.
netcoder

효과가있다! XDebug 사용 여부에 관계없이 php.ini에서 줄을 주석 처리하지 않아도됩니다. 나는 명시 적으로 사용했다 : ini_set ( 'xdebug.max_nesting_level', -1);
user2928048

13

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

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


1

개인적으로 조정이 필요한 설정과 달리 오류라고 제안합니다. 내 코드에서 컨트롤러 중 하나의 라이브러리와 동일한 이름을 가진 클래스가 있었기 때문에 클래스가 트립 된 것처럼 보였습니다.

출력 오류 및 이것이 트리거되는 위치를 확인하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.