it-swarm.com.de

Lösung für "Schwerwiegender Fehler: Maximaler Verschachtelungsgrad von '100' erreicht, Abbruch!" im PHP

Ich habe eine Funktion erstellt, die alle URLs in einer HTML-Datei findet und denselben Prozess für jeden HTML-Inhalt wiederholt, der mit den ermittelten URLs verknüpft ist. Die Funktion ist rekursiv und kann endlos weiterlaufen. Ich habe jedoch die Rekursion durch das Setzen einer globalen Variablen begrenzt, wodurch die Rekursion nach 100 Rekursionen gestoppt wird.

Php gibt jedoch diesen Fehler zurück:

Schwerwiegender Fehler: Maximaler Verschachtelungsgrad von '100' erreicht, Abbruch! im D:\wamp\www\crawler1\simplehtmldom_1_5\simple_html_dom.php on line 1355

ERROR

Ich habe hier eine Lösung gefunden: Erhöhung der Aufrufe der Verschachtelungsfunktion limit aber das funktioniert in meinem Fall nicht.

Ich zitiere eine der Antworten aus dem oben genannten Link. Bitte überlege es dir.

"Haben Sie Zend, IonCube oder xDebug installiert? Wenn ja, dann erhalten Sie wahrscheinlich diesen Fehler.

Ich bin vor ein paar Jahren darauf gestoßen, und am Ende hatte Zend dieses Limit gesetzt, nicht PHP. Wenn Sie es entfernen, werden Sie natürlich die 100 Iterationen überschreiten, aber schließlich werden Sie an die Speichergrenzen stoßen. "

Gibt es eine Möglichkeit, den maximalen Verschachtelungsgrad von Funktionen in PHP zu erhöhen

118
Rafay

Eine einfache Lösung löste mein Problem. Ich habe gerade diese Zeile kommentiert:

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

in meiner php.ini-Datei. Diese Erweiterung beschränkte den Stack auf 100, sodass ich ihn deaktiviert habe. Die rekursive Funktion arbeitet jetzt wie erwartet.

51
Rafay

Erhöhen Sie den Wert von xdebug.max_nesting_level in Ihrer php.ini: http://xdebug.org/docs/all_settings#max_nesting_level

134
Maxence

Anstatt rekursive Funktionsaufrufe auszuführen, arbeiten Sie mit einem Warteschlangenmodell, um die Struktur zu reduzieren.

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

Es gibt verschiedene Möglichkeiten, damit umzugehen. Sie können weitere Informationen nachverfolgen, wenn Sie Einblick in den Ursprung oder die durchlaufenen Pfade benötigen. Es gibt auch verteilte Warteschlangen, die mit einem ähnlichen Modell arbeiten können.

Eine andere Lösung ist das Hinzufügen von xdebug.max_nesting_level = 200 in Ihrer php.ini

40
bacar ndiaye

Anstatt den xdebug zu deaktivieren, können Sie den oberen Grenzwert wie einstellen

xdebug.max_nesting_level = 500

23
shahinam

Es ist auch möglich, dies direkt in PHP zu beheben, zum Beispiel in der Konfigurationsdatei Ihres Projekts.

ini_set('xdebug.max_nesting_level', 200);

18
svassr

Schauen Sie in /etc/php5/conf.d/ nach, ob eine Datei namens xdebug.ini vorhanden ist

max_nesting_level ist standardmäßig 100

Wenn es in dieser Datei nicht festgelegt ist, fügen Sie Folgendes hinzu:

xdebug.max_nesting_level=300

bis zum Ende der Liste, so sieht es so aus

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

sie können dann @ Andreys test vor und nach dieser Änderung verwenden, um zu sehen, ob es funktioniert.

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

Gehen Sie in Ihre php.ini-Konfigurationsdatei und ändern Sie die folgende Zeile:

xdebug.max_nesting_level=100

zu etwas wie:

xdebug.max_nesting_level=200
12

auf Ubuntu mit PHP 5.59: 
zu `: 

/etc/php5/cli/conf.d

und finde deine xdebug.ini in diesem Verzeichnis. In meinem Fall ist 20-xdebug.ini

und fügen Sie diese Zeile hinzu

xdebug.max_nesting_level = 200 


oder dieses 

xdebug.max_nesting_level = -1

wenn Sie den Wert auf -1 setzen, müssen Sie sich nicht sorgen, den Wert der Schachtelungsebene zu ändern.

`

12
Gujarat Santana

ist wahrscheinlich wegen xdebug passiert.

Kommentieren Sie die folgende Zeile in Ihrer "php.ini" und starten Sie den Server neu, um PHP neu zu laden.

";xdebug.max_nesting_level"

12
vandersondf

php.ini:

xdebug.max_nesting_level = -1

Ich bin nicht ganz sicher, ob der Wert jemals überläuft und -1 erreicht, aber er wird entweder nie -1 erreichen oder den Wert für max_nesting_level ziemlich hoch setzen.

7
Martyn Shutt

Sie könnten versuchen, die Verschachtelung durch die Implementierung paralleler Worker (wie beim Cluster-Computing) herunterzuwackeln, anstatt die Anzahl der Aufrufe der Verschachtelungsfunktionen zu erhöhen.

Beispiel: Sie definieren eine begrenzte Anzahl von Arbeitsplätzen (z. B. 100) und überwachen die Anzahl der ihnen zugewiesenen "Arbeiter". Wenn Slots frei werden, setzen Sie die wartenden Arbeiter "hinein".

6
tamasgal

Sie können Ihren rekursiven Code in einen iterativen Code konvertieren, der die Rekursion simuliert. Dies bedeutet, dass Sie den aktuellen Status (URL, Dokument, Position im Dokument usw.) in ein Array verschieben müssen, wenn Sie einen Link erreichen, und ihn aus dem Array herausspringen, wenn dieser Link abgeschlossen ist.

5
Yogu

Überprüfen Sie die Rekursion von der Befehlszeile aus:

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

wenn Ergebnis> 100 THEN, Speicherbegrenzung prüfen;

4
Andrey

Wenn Sie Laravel verwenden, tun Sie dies

composer update

Das sollte funktionieren.

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

P.S. Ändern Sie 9999 in eine beliebige Nummer.

2
cofirazak

Sie können auch die Funktion {debug} in modifier.debug_print_var.php ändern, um die Rekursion in Objekte zu begrenzen.

Um die Linie 45 herum, vor:

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

Nach dem :

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

Auf diese Weise verhält sich Xdebug weiterhin normal: Begrenzen Sie die Rekursionstiefe in var_dump und so weiter. Da dies ein Smarty-Problem ist, kein Xdebug-Problem!

0
theredled

In Ihrem Fall hat die Crawlerinstanz definitiv mehr Xdebug-Grenzwerte für die Fehler- und Debugging-Informationen.

In anderen Fällen können jedoch auch Fehler wie in PHP oder Kerndateien wie CodeIgniter-Bibliotheken einen solchen Fall erzeugen. Wenn Sie die Einstellung für den x-Debug-Level sogar erhöhen, würde er nicht verschwinden.

Schauen Sie sich also Ihren Code genau an :).

Hier war das Problem in meinem Fall.

Ich hatte eine Service-Klasse, die Bibliothek in CodeIgniter ist. Eine Funktion wie diese haben.

 class PaymentService {

    private $CI;

    public function __construct() {

        $this->CI =& get_instance();

   }

  public function process(){
   //lots of Ci referencing here...
   }

Mein Controller wie folgt:

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

Der Funktionsaufruf in der letzten Zeile war aufgrund des Tippfehlers falsch, stattdessen hätte er wie folgt aussehen sollen:

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

Dann bekam ich immer die Überschreitungsfehlermeldung. Aber ich habe XDebug deaktiviert, aber nicht geholfen. Überprüfen Sie auf jeden Fall Ihren Klassennamen oder Ihren Code auf korrekte Funktionsaufrufe.

0
danielad

Ich hatte dieses Problem mit WordPress auf Cloud9. Es stellte sich heraus, dass es das W3 Caching-Plugin war. Ich habe das Plugin deaktiviert und es hat gut funktioniert.

0
sobeit

Eine andere Lösung, wenn Sie PHP-Skript in CLI (cmd) ausführen

Die php.ini-Datei, die bearbeitet werden muss, unterscheidet sich in diesem Fall. In meiner WAMP-Installation lautet die in die Befehlszeile geladene Datei php.ini:

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

anstelle von\wamp\bin\Apache\apache2.4.9\bin\php.ini, die geladen wird, wenn PHP vom Browser ausgeführt wird

0
Binod

Ich hatte einen Fehler, als ich viele Plugins installierte. Also zeigte der Fehler 100 den Speicherort des letzten Plugins an, das ich installiert habe: C:\wamp\www\mysite\wp-content\plugins\"...". Also habe ich dieses Plugin gelöscht Ordner auf dem Laufwerk C: dann war alles wieder normal. Ich denke, ich muss die Menge an Plug-In einschränken, die ich installiere oder .good Glück aktiviert habe. Ich hoffe, es hilft

0
CalvinMD