Zrobiłem funkcję, która wyszukuje wszystkie adresy URL w pliku html i powtarza ten sam proces dla każdej treści html połączonej z wykrytymi adresami URL. Funkcja jest rekurencyjna i może trwać bez końca. Jednak ograniczyłem rekursję, ustawiając zmienną globalną, która powoduje zatrzymanie rekursji po 100 rekurencjach.
Jednak php zwraca ten błąd:
Błąd krytyczny: osiągnięto maksymalny poziom zagnieżdżenia funkcji „100”, przerywanie! in D: \ wamp \ www \ crawler1 \ simplehtmldom_1_5 \ simple_html_dom.php on line 1355
Znalazłem tutaj rozwiązanie: Zwiększenie limitu wywołań funkcji zagnieżdżania, ale to nie działa w moim przypadku.
Cytuję jedną z odpowiedzi z powyższego linku. Proszę, rozważ to.
„Czy masz zainstalowany Zend, IonCube lub xDebug? Jeśli tak, prawdopodobnie jest to źródło tego błędu.
Wpadłem na to kilka lat temu i skończyło się na tym, że Zend stawia to ograniczenie, a nie PHP. Oczywiście usunięcie go pozwoli> przekroczyć 100 iteracji, ale w końcu przekroczysz limity pamięci ”.
Czy istnieje sposób na zwiększenie maksymalnego poziomu zagnieżdżenia funkcji w PHP
Odpowiedzi:
Zwiększ wartość
xdebug.max_nesting_level
w swoimphp.ini
źródło
xdebug.max_nesting_level = -1
Proste rozwiązanie rozwiązało mój problem. Właśnie skomentowałem tę linię:
w moim
php.ini
pliku. To rozszerzenie ograniczało stos do,100
więc je wyłączyłem. Funkcja rekurencyjna działa teraz zgodnie z oczekiwaniami.źródło
Zamiast korzystać z rekurencyjnych wywołań funkcji, pracuj z modelem kolejki, aby spłaszczyć strukturę.
Istnieją różne sposoby radzenia sobie z tym. Możesz śledzić więcej informacji, jeśli potrzebujesz wglądu w początek lub pokonywane ścieżki. Istnieją również kolejki rozproszone, które mogą działać na podobnym modelu.
źródło
Innym rozwiązaniem jest dodanie
xdebug.max_nesting_level = 200
pliku php.iniźródło
ini_set('xdebug.max_nesting_level', 200);
Zamiast wyłączać xdebug, możesz ustawić wyższy limit, na przykład
źródło
Można to również naprawić bezpośrednio w php, na przykład w pliku konfiguracyjnym projektu.
ini_set('xdebug.max_nesting_level', 200);
źródło
Wejdź do pliku konfiguracyjnego php.ini i zmień następujący wiersz:
na coś takiego:
źródło
na Ubuntu przy użyciu PHP 5.59:
trzeba:
i znajdź swój xdebug.ini w tym katalogu , w moim przypadku jest to 20-xdebug.ini
i dodaj tę linię `
albo to
ustaw ją na -1 i nie musisz się martwić o zmianę wartości poziomu zagnieżdżenia.
`
źródło
prawdopodobnie stało się to z powodu xdebug.
Spróbuj skomentować następujący wiersz w swoim „php.ini” i zrestartuj serwer, aby przeładować PHP.
";xdebug.max_nesting_level"
źródło
Spróbuj poszukać w /etc/php5/conf.d/, aby sprawdzić, czy jest plik o nazwie xdebug.ini
max_nesting_level to domyślnie 100
Jeśli nie jest ustawiony w tym pliku, dodaj:
do końca listy, więc wygląda to tak
możesz następnie użyć testu @ Andrey'a przed i po wprowadzeniu tej zmiany, aby sprawdzić, czy zadziałało.
źródło
.ini
plik. Nawiasem mówiąc, kiedy uruchamiasz php5-fpm ten plik prawdopodobnie jest gdzieś tutaj:/etc/php5/fpm/conf.d/20-xdebug.ini
php.ini:
Nie jestem do końca pewien, czy wartość kiedykolwiek się przepełni i osiągnie -1, ale albo nigdy nie osiągnie -1, albo ustawia max_nesting_level dość wysoko.
źródło
Możesz przekonwertować swój rekurencyjny kod na kod iteracyjny, który symuluje rekurencję. Oznacza to, że musisz wypchnąć aktualny stan (adres URL, dokument, pozycja w dokumencie itp.) Do tablicy, gdy dotrzesz do łącza, i wyskoczyć z tablicy, gdy ten link się skończy.
źródło
Możesz spróbować ograniczyć zagnieżdżanie, wdrażając równoległe procesy robocze (jak w przypadku obliczeń klastrowych) zamiast zwiększać liczbę wywołań funkcji zagnieżdżania.
Na przykład: definiujesz ograniczoną liczbę slotów (np. 100) i monitorujesz liczbę „pracowników” przypisanych do każdego / niektórych z nich. Jeśli któryś z miejsc stanie się wolny, umieszczasz w nim oczekujących pracowników.
źródło
Sprawdź rekursję z wiersza poleceń:
jeśli wynik> 100 TO sprawdź limit pamięci;
źródło
Jeśli używasz Laravel, zrób
To powinno działać.
źródło
PS Zmień 9999 na dowolną liczbę.
źródło
Wystąpił błąd podczas instalowania wielu wtyczek, więc pokazał się błąd 100 zawierający lokalizację ostatniej zainstalowanej wtyczki C: \ wamp \ www \ mysite \ wp-content \ plugins \ "..." więc usunąłem tę wtyczkę folder na dysku C: wszystko wróciło do normy Myślę, że muszę ograniczyć ilość zainstalowanej wtyczki lub aktywowałem. powodzenia mam nadzieję, że to pomoże
źródło
W twoim przypadku zdecydowanie instancja robota ma większy limit Xdebug do śledzenia błędów i informacji debugowania.
Ale w innych przypadkach również błędy, takie jak w PHP lub plikach core, takich jak biblioteki CodeIgniter, utworzą taki przypadek i jeśli nawet zwiększysz ustawienie poziomu x-debug, nie zniknie.
Przyjrzyj się więc uważnie swojemu kodowi :).
Tutaj był problem w moim przypadku.
Miałem klasę usług, która jest biblioteką w CodeIgniter. Mając wewnątrz taką funkcję.
Mój kontroler w następujący sposób:
Wywołanie funkcji w ostatniej linii było błędne z powodu literówki, zamiast tego powinno wyglądać jak poniżej:
Następnie otrzymywałem komunikat o błędzie przekroczenia. Ale wyłączyłem XDebug, ale nie pomogło. W każdym razie sprawdź nazwę klasy lub kod pod kątem prawidłowego wywołania funkcji.
źródło
Miałem ten problem z WordPress na cloud9. Okazuje się, że była to wtyczka W3 Caching. Wyłączyłem wtyczkę i działało dobrze.
źródło
Inne rozwiązanie, jeśli uruchamiasz skrypt php w CLI (cmd)
Plik php.ini, który wymaga edycji, jest w tym przypadku inny. W mojej instalacji WAMP plik php.ini, który jest ładowany w wierszu poleceń, to:
zamiast \ wamp \ bin \ apache \ apache2.4.9 \ bin \ php.ini, który ładuje się, gdy php jest uruchamiany z przeglądarki
źródło
Możesz także zmodyfikować funkcję {debug} w modifier.debug_print_var.php, aby ograniczyć rekursję do obiektów.
Wokół linii 45, przed:
Po :
W ten sposób Xdebug nadal będzie zachowywał się normalnie: ogranicz głębokość rekursji w var_dump i tak dalej. Ponieważ jest to drobny problem, a nie Xdebug!
źródło
Miałem ten sam problem i tak mi się podoba:
Otwórz plik MySQL my.ini
W sekcji [mysqld] dodaj następujący wiersz: innodb_force_recovery = 1
Zapisz plik i spróbuj uruchomić MySQL
Usuń tę linię, którą właśnie dodałeś i Zapisz
źródło