Homepage selbermachen 7.851 Themen, 35.616 Beiträge

frage zu php-programmierung und webserver

POD / 4 Antworten / Flachansicht Nickles

ist es eigentlich schlimm, wenn man auf einem apache mit php ein script hat, das unter umständen eine unendliche rekursion durchläuft und in der php.ini ist keine maximale ausführungsdauer für das script gesetzt?

bei Antwort benachrichtigen
Elvereth POD „frage zu php-programmierung und webserver“
Optionen

Hi POD,
eine unendliche Rekursion ist nie ein gutes Zeichen. Da muss wohl irgend ein Fehler drin stecken. Oder wie der Borlander andeutet, definiere vor der Rekursion eine zusätzliche Variable, so eine Art Notbremse, die Du bei jeder Iteration (Selbstaufruf) um eins hochzählst, danach um eins runter zählst und die Iterationsfunktion selbst abbrechen lässt, wenn diese Variable beim Start einen Maximalwert bereits erreicht hat.

Beispiel für die Begrenzung der Iterationstiefe:

[code]
$max_stufe = 10; // je größer, desto länger dauert die Rekursion.

function Rekursion($stufe, ... ){ // $stufe -> begrenzt die Rekursionsstufe
global $max_stufe;
if($stufe ...
Rekursion($stufe+1, ... ); // Iteration mit übergebener nächster Rekursionsstufe
}
}
function InitRekursion(){
...
Rekursion(1, ... ); // fangen wir mit Stufe 1 an
}

InitRekursion();
[/code]

alternativ kann die if()-Anweisung in der Rekursionsfunktion umschreiben:

[code]
function Rekursion($stufe, ... ){ // $stufe -> begrenzt die Rekursionsstufe
global $max_stufe;
if($stufe>=$max_stufe)return false; // wird nur ausgeführt wenn $stufe kleiner ist als max_stufe
...
Rekursion($stufe+1, ... ); // Iteration mit übergebener nächster Rekursionsstufe
return true;
}
[/code]


bei einer While-Schleife würde ich die Not-Begrenzung mit & zur normalen Bedingung verknüpfen, falls letztere aufgrund eines Fehlers nie false wird und so die Schleife allein ewig laufen lässt. Das benutz' ich ab und zu für Debug-Zwecke, um herauszubekommen, warum die eigentliche Bedingung nicht false wird. Dann nehm ich die "Notbremse" wieder raus.

[code]
$notbremse=500; // Begrenzt die Schleife auf die entsprechende Anzahl Wiederholungen
$i=10;
while( ($i0) ){
...
$j--; // Fehler, $i wird nicht runtergezählt, ohne $notbremse wäre die While-Schleife ewig.
...
$notbremse--;
}
[/code]

Unendliche Schleifen lassen den Benutzer einen langen Bart wachsen und an altersschwäche sterben, bevor sie das Ergebnis ihrer Warterei sehen können. Das kann nicht gut sein...

CU Elvereth


Meine Heizung hat drei Gigahertz. http://www.svenspages.de/
bei Antwort benachrichtigen