Endlosschleife legt Server lahm
Sven
- php
Hallo,
ich hab in einem Script einen Bug, so dass manchmal eine while-Schleife kein Ende findet. Doch das nur am Rande, denn dabei ist mir was aufgefallen...
Wie kann es sein, dass so eine Endlosschleife den ganzen Apachen lahmlegt? Die ganze Website ist nicht mehr erreichbar, der Server "hängt" einfach und lädt die Seite und lädt und lädt... bis das fehlerhafte Script, das immer noch in seiner Endlosschleife hängt, die maximale Scriptlaufzeit erreicht hat und beendet wird. Dann klappt alles wieder.
Ist das normal, oder kann man das ändern? Ist zwar schlecht, wenn ein Script in eine Endlosschleife gerät, aber dass deswegen der ganze Betrieb gestört wird, dürfte eigentlich nicht sein... man stelle sich einen Hosting-Provider vor, der Tausende Internetseiten auf einem Server hostet... ein Benutzer lädt (absichtlich) ein Endlosschleifen-Script hoch und Tausende Seiten bleiben dann hängen...
Die maximale Scriptlaufzeit kann ich nicht verringern, da unter Umständen Dateien bis zu einer Größe von 100MB hochgeladen werden müssen. Aber ich dachte, vielleicht gibts ne Einstellung, dass jedes Script für sich gekapselt abläuft oder sowas?
Grüße
Sven
Hallo, Sven!
Das ist letztlich eine Frage der Anbindung. Bei mod_php bspw. wartet Apache auf die Antwort vom Script, so dass Du sicherstellen solltest, dass eine kommt. Bei Schleifen sollte daher immer eine Maximalgrenze mitgegeben werden.
Eine Alternative besteht in einer CGI-Anbindung, die mehrere Threads zuläßt, bspw. fastcgi. Trotzdem ist es sinnvoll, Endlosschleifen zu vermeiden.
Gruß, LX
Hallo,
ja, im Moment läuft PHP als Modul. Endlosschleifen sind ja keine Absicht, jedenfalls nicht bei mir... aber wenn doch mal ein Fall eintritt, den ich nicht berücksichtigt hatte, ist das natürlich ärgerlich.
Das heißt, würde ich PHP als CGI einbinden, hätte ich das Problem nicht? Der Nachteil aber wäre: Schlechtere Performance, mehr Speicherverbrauch...?
ich werd mal eben Googlen und mich ein bisschen über CGI und FastCGI schlau machen... :)
Grüße
Sven
FastCGI beseitigt den Performanceverlust, indem es den Interpreter persistent laufen läßt. Der Speicherverbrauch ist dabei auch nur unwesentlich höher.
Gruß, LX
Hello,
bei normalen Scripten sehe ich da keine Probleme, weil sie in einem eigenen Prozess mit einer einstellbaren Priorität gestartet werden.
Wenn die Scripte allerdings Kinder erzeugen dürfen, dann kann es relativ schnell zum Absturz des Systems kommen. Eine "Fork Bomb" kann den Server dann lahm legen.
Eventuell könnte ulimit helfen, sofern es ein Linux-System ist.
Liebe Grüße aus Syburg bei Dortmund
Tom vom Berg