복붙노트

"치명적인 오류 : PHP의 최대 기능 중첩 수준 '100'도달, 중단 중!"

PHP

"치명적인 오류 : PHP의 최대 기능 중첩 수준 '100'도달, 중단 중!"

나는 html 파일 내의 모든 URL을 찾고 발견 된 URL에 링크 된 각 HTML 컨텐트에 대해 동일한 프로세스를 반복하는 함수를 만들었습니다. 이 함수는 재귀 적이며 끝없이 계속 될 수 있습니다. 그러나 나는 재귀가 100 회 반복 된 후에 멈추게하는 전역 변수를 설정함으로써 재귀에 한계를두고있다.

그러나, PHP는이 오류를 반환합니다 :

여기서 해결책을 찾았습니다. 중첩 함수 호출 수가 제한되어 있지만이 경우에는 작동하지 않습니다.

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

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

해결법

  1. ==============================

    1.php.ini에서 xdebug.max_nesting_level의 값을 늘리십시오 : http://xdebug.org/docs/all_settings#max_nesting_level

    php.ini에서 xdebug.max_nesting_level의 값을 늘리십시오 : http://xdebug.org/docs/all_settings#max_nesting_level

  2. ==============================

    2.간단한 해결책은 나의 문제를 해결했다. 방금이 줄을 주석 :

    간단한 해결책은 나의 문제를 해결했다. 방금이 줄을 주석 :

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

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

  3. ==============================

    3.재귀 함수 호출 대신 대기열 모델을 사용하여 구조를 평평하게 만듭니다.

    재귀 함수 호출 대신 대기열 모델을 사용하여 구조를 평평하게 만듭니다.

    $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;
    }
    

    그것을 처리하는 다른 방법이 있습니다. 가로 지르는 원점이나 경로에 대한 통찰력이 필요하면 더 많은 정보를 추적 할 수 있습니다. 유사한 모델에서 작동 할 수있는 분산 대기열도 있습니다.

  4. ==============================

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

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

  5. ==============================

    5.xdebug를 비활성화하는 것보다 더 높은 한계를 설정할 수 있습니다.

    xdebug를 비활성화하는 것보다 더 높은 한계를 설정할 수 있습니다.

  6. ==============================

    6.예를 들어 프로젝트의 config 파일과 같이 PHP에서 직접 수정하는 것도 가능합니다.

    예를 들어 프로젝트의 config 파일과 같이 PHP에서 직접 수정하는 것도 가능합니다.

    ini_set ( 'xdebug.max_nesting_level', 200);

  7. ==============================

    7.xdebug 때문에 아마 일어 났을 것입니다.

    xdebug 때문에 아마 일어 났을 것입니다.

    "php.ini"에서 다음 줄을 주석 처리하고 서버를 다시 시작하여 PHP를 다시로드하십시오.

    "; xdebug.max_nesting_level"

  8. ==============================

    8./etc/php5/conf.d/에서 xdebug.ini라는 파일이 있는지 살펴보십시오.

    /etc/php5/conf.d/에서 xdebug.ini라는 파일이 있는지 살펴보십시오.

    max_nesting_level은 기본적으로 100입니다.

    해당 파일에 설정되지 않은 경우 add :

    xdebug.max_nesting_level=300
    

    목록의 끝 부분에 다음과 같이 표시됩니다.

    xdebug.remote_enable=on
    xdebug.remote_handler=dbgp
    xdebug.remote_host=localhost
    xdebug.remote_port=9000
    xdebug.profiler_enable=0
    xdebug.profiler_enable_trigger=1
    xdebug.profiler_output_dir=/home/drupalpro/websites/logs/profiler
    xdebug.max_nesting_level=300
    

    이 변경 전후에 @ Andrey의 테스트를 사용하여 효과가 있는지 확인할 수 있습니다.

    php -r 'function foo() { static $x = 1; echo "foo ", $x++, "\n"; foo(); } foo();'
    
  9. ==============================

    9.php.ini 설정 파일로 가서 다음 줄을 변경하십시오 :

    php.ini 설정 파일로 가서 다음 줄을 변경하십시오 :

    xdebug.max_nesting_level=100
    

    좋아하는 것 :

    xdebug.max_nesting_level=200
    
  10. ==============================

    10.PHP 5.59를 사용하는 우분투에서 : '에 도착했다 :

    PHP 5.59를 사용하는 우분투에서 : '에 도착했다 :

    그 dir에서 xdebug.ini를 찾으십시오. 제 경우에는 20-xdebug.ini입니다.

    이 줄을`

    아니면 이거

    -1로 설정하면 중첩 수준의 값을 변경하는 것에 대해 걱정할 필요가 없습니다.

    `

  11. ==============================

    11.php.ini :

    php.ini :

    값이 오버플로되어 -1에 도달하는지 완전히 확신 할 수는 없지만 -1에 도달하지 않거나 max_nesting_level을 상당히 높게 설정합니다.

  12. ==============================

    12.중첩 함수 호출 수를 늘리는 대신 병렬 작업자 (예 : 클러스터 컴퓨팅)를 구현하여 중첩을 흔들어 볼 수 있습니다.

    중첩 함수 호출 수를 늘리는 대신 병렬 작업자 (예 : 클러스터 컴퓨팅)를 구현하여 중첩을 흔들어 볼 수 있습니다.

    예를 들어 제한된 수의 슬롯 (예 : 100)을 정의하고 각 슬롯에 할당 된 "작업자"의 수를 모니터링합니다. 슬롯이 비어있는 경우, 대기중인 작업자를 "그 안에"두십시오.

  13. ==============================

    13.재귀 코드를 반복 코드로 변환하여 재귀를 시뮬레이트 할 수 있습니다. 즉,이 링크가 끝나면 링크에 도달하면 어레이의 현재 상태 (URL, 문서, 위치 등)를 배열로 푸시하고 배열 밖으로 팝해야합니다.

    재귀 코드를 반복 코드로 변환하여 재귀를 시뮬레이트 할 수 있습니다. 즉,이 링크가 끝나면 링크에 도달하면 어레이의 현재 상태 (URL, 문서, 위치 등)를 배열로 푸시하고 배열 밖으로 팝해야합니다.

  14. ==============================

    14.명령 줄에서 재귀 확인 :

    명령 줄에서 재귀 확인 :

    php -r 'function foo() { static $x = 1; echo "foo ", $x++, "\n"; foo(); } foo();'
    

    결과> 100이면 메모리 한도를 확인합니다.

  15. ==============================

    15.Laravel을 사용하는 경우

    Laravel을 사용하는 경우

    composer update
    

    이것은 일해야합니다.

  16. ==============================

    16.

    <?php
    ini_set('xdebug.max_nesting_level', 9999);
    ... your code ...
    

    추신 9999를 원하는 번호로 변경하십시오.

  17. ==============================

    17.나는 많은 플러그인을 설치할 때 오류가 발생했습니다. 따라서 오류 100은 마지막 플러그인의 위치를 ​​포함하여 C : \ wamp \ www \ mysite \ wp-content \ plugins \ "..."를 설치 한 것을 보여 주므로이 플러그인을 삭제했습니다. 폴더에있는 C : 드라이브를 누른 다음 모든 정상으로 돌아왔다. 나는 플러그인의 양을 제한해야한다고 생각 설치하거나 활성화했습니다. 행운을 빌어 요 내가 도움이되기를 바랍니다.

    나는 많은 플러그인을 설치할 때 오류가 발생했습니다. 따라서 오류 100은 마지막 플러그인의 위치를 ​​포함하여 C : \ wamp \ www \ mysite \ wp-content \ plugins \ "..."를 설치 한 것을 보여 주므로이 플러그인을 삭제했습니다. 폴더에있는 C : 드라이브를 누른 다음 모든 정상으로 돌아왔다. 나는 플러그인의 양을 제한해야한다고 생각 설치하거나 활성화했습니다. 행운을 빌어 요 내가 도움이되기를 바랍니다.

  18. ==============================

    18.귀하의 경우에는 크롤러 인스턴스가 오류 및 디버그 정보를 추적하기 위해 더 많은 Xdebug 제한이 있어야합니다.

    귀하의 경우에는 크롤러 인스턴스가 오류 및 디버그 정보를 추적하기 위해 더 많은 Xdebug 제한이 있어야합니다.

    하지만 다른 경우에는 PHP 나 CodeIgniter 라이브러리 같은 코어 파일 같은 오류가 발생하여 x-debug level 설정을 늘려도 사라지지 않을 것입니다.

    따라서 코드를 자세히 살펴보십시오.

    제 경우에 문제가있었습니다.

    CodeIgniter의 라이브러리 인 서비스 클래스가 있습니다. 이런 식으로 내부에 기능이 있습니다.

     class PaymentService {
    
        private $CI;
    
        public function __construct() {
    
            $this->CI =& get_instance();
    
       }
    
      public function process(){
       //lots of Ci referencing here...
       }
    

    내 컨트롤러는 다음과 같습니다 :

    $this->load->library('PaymentService');
    $this->process_(); // see I got this wrong instead  it shoud be like 
    

    마지막 줄의 함수 호출은 오타 때문에 잘못되었습니다. 대신 아래와 같이되어야합니다 :

    $this->Payment_service->process(); //the library class name
    

    그럼 초과 오류 메시지를 계속 지키고 있었다. 하지만 XDebug는 사용하지 않았지만 도움이되지는 못했습니다. 어떤 방법 으로든 적절한 함수 호출을 위해 클래스 이름이나 코드를 확인하십시오.

  19. ==============================

    19.나는 cloud9에 워드 프레스와 함께이 문제가있었습니다. W3 Caching Plugin이라고 밝혀졌습니다. 나는 플러그인을 비활성화 시켰고 정상적으로 작동했다.

    나는 cloud9에 워드 프레스와 함께이 문제가있었습니다. W3 Caching Plugin이라고 밝혀졌습니다. 나는 플러그인을 비활성화 시켰고 정상적으로 작동했다.

  20. ==============================

    20.이 경우에는 편집이 필요한 php.ini 파일이 다릅니다. 내 WAMP 설치에서 명령 줄에로드 된 php.ini 파일은 다음과 같습니다.

    이 경우에는 편집이 필요한 php.ini 파일이 다릅니다. 내 WAMP 설치에서 명령 줄에로드 된 php.ini 파일은 다음과 같습니다.

    \wamp\bin\php\php5.5.12\php.ini
    

    \ wamp \ bin \ apache \ apache2.4.9 \ bin \ php.ini 대신 브라우저에서 PHP를 실행할 때로드됩니다.

  21. ==============================

    21.객체로 재귀를 제한하기 위해 modifier.debug_print_var.php에서 {debug} 함수를 수정할 수도 있습니다.

    객체로 재귀를 제한하기 위해 modifier.debug_print_var.php에서 {debug} 함수를 수정할 수도 있습니다.

    45 호선 전 :

    $results .= '<br>' . str_repeat('&nbsp;', $depth * 2)
      . '<b> -&gt;' . strtr($curr_key, $_replace) . '</b> = '
      . smarty_modifier_debug_print_var($curr_val, ++$depth, $length);
    

    이후 :

    $max_depth = 10;
    $results .= '<br>' . str_repeat('&nbsp;', $depth * 2)
      . '<b> -&gt;' . strtr($curr_key, $_replace) . '</b> = '
      . ($depth > $max_depth ? 'Max recursion depth:'.(++$depth) : smarty_modifier_debug_print_var($curr_val, ++$depth, $length));
    

    이렇게하면 Xdebug는 여전히 정상적으로 작동합니다 : var_dump에서 재귀 깊이를 제한합니다. 이것은 현명한 문제이므로 Xdebug가 아닙니다!

  22. from https://stackoverflow.com/questions/8656089/solution-for-fatal-error-maximum-function-nesting-level-of-100-reached-abor by cc-by-sa and MIT license