Homepage selbermachen 7.852 Themen, 35.619 Beiträge

frage zu php-programmierung und webserver

POD / 4 Antworten / Baumansicht 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
Borlander POD „frage zu php-programmierung und webserver“
Optionen

Wenn es nicht stört das der Computer auf dem das Script läuft unendlich (eben so lange wie das Script läuft) lange 100% CPU-Last haben wird...

Sauberste Lösung: SIcherstellen das die Rekursion abbricht
Auch möglich: Im Script selbst einen sinnvollen TimeOut definieren


Gruß
Borlander

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
POD Nachtrag zu: „frage zu php-programmierung und webserver“
Optionen

erst einmal danke für die antworten. zur richtigstellung muß ich sagen, daß es nicht meine homepage ist sondern die eines webdesigners, ich weiß also auch nicht genau wie der quellcode aussieht. mir ist nur aufgefallen daß man das script endlos in einer schleife laufen lassen kann wenn man es mit einem entsprechenden parameter aufruft, dabei produziert es auch rekursiv beliebig viel code.
ich hatte da etwas bedenken bezüglich einer denial of service attacke auf den server und wegen der generierung von immens viel traffic und hatte überlegt dem webdesigner einen tipp zu geben.

bei Antwort benachrichtigen
Elvereth POD „erst einmal danke für die antworten. zur richtigstellung muß ich sagen, daß...“
Optionen

Hi POD,

das ist eine gute Überlegung. Das Script sollte so angepasst werden, dass solche Fehler abgefangen werden. Oder wie oben erwähnt eine Zählvariable einbauen, die man einfach vergleichen kann.

Nach Murphy heisst es so schön "Was schief gehen kann, wird auch schiefgehen.". Also nicht drauf verlassen, dass niemand drauf kommt, die "bösen" Parameter dem Script zu übergeben.

CU Elvereth

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