|
|
#1 (permalink) |
|
Teilzeitcholeriker
|
Hallo zusammen,
auf einem Server, der meines Wissens nach nur von einem Kunden genutzt wird, hatte ich ein kleines Problem. Ich habe ein Script angestoßen, dass nach einer Weile einen "PHP Fatal error: Maximum execution time of 30 seconds exceeded" geworfen hat. Nach 40 Minuten hat sich der Server-Betreiber bei mir gemeldet und gefragt, was da los sei. Sein Server sei zu 100% ausgelastet, die Festplatten voll beschäftigt. Nach meiner Logik müsste der Apache doch nach dem PHP-Fatal-Error seine Arbeit wieder einstellen und alle Resourcen frei geben. Kann es sein, dass der Server durch den (bzw. trotz des) Timeouts in die Knie gezwungen wurde? Das Script mit dem Problem ist ein Synchronisation-Script, das nicht öffentlich erreichbar ist. Dass also mehrere Instanzen davon liefen, ist auszuschließen. Und auch in der Error-Log ist nur der eine Fatal-Error zu sehen. Das Script kopiert Bilder auf der Festplatte umher. Als das Problem auftrat war er vermutlich gerade bei einem JPG mit fast 10 MB. Kann mir jemand sagen, ob ich ein sch*** Script geschrieben habe, oder ob der Hoster seinen Server schlecht konfiguriert hat? Jesus Christus spricht: "Meine Kraft ist in den Schwachen mächtig." Geändert von wahnsinn (11.08.2010 um 17:07:18 Uhr) Grund: ... NICHT öffentlich erreichbar ... |
|
|
|
| Gesponsorte Links |
|
|
#2 (permalink) |
|
return void
|
Eigentlich sollte das Script stoppen.
Kannst du näheres beschreiben, was das Script gemacht hat und was das Script böses machen sollte? "Die Festplatten sind auf 100%" ist nämlich eine sehr kompetente Aussage eines ServerAdmins Fängst du möglicherweise Fehler mit einem eigenen Error-Handler ab? Dann kann es nämlich weiterlaufen. Startet das Script neue HTTP-Aufrufe? Hat es eine DB-Verbindung die irgendwelche komplexen Dinge macht? |
|
|
|
|
|
#3 (permalink) | ||||||
|
Teilzeitcholeriker
|
Ja, ich hab einen eigenen Error-Handler. Heißt das, ich müsste da irgendwo ein exit; einbauen?
PHP-Code:
PHP-Code:
// Edit: Wobei ich sagen muss, dass das Script auf meiner lokalen Testumgebung nach einen Fatal-Memory-Error wunderbar gestoppt hat. // Edit 2: Zum Ablauf des Scripts: Es wird eine XML-Datei geparst, dazu dann Datenbank-Einträge geschrieben und anschließend werden Dateien über eine HTTP-Verbindung geholt. Dazu wird geprüft, ob eine Datei schon existiert. Wenn nicht, wird sie von einem anderen Server über HTTP geholt. Wenn ja, wird sie von lokal kopiert. Zu jeder Datei gibt es dann noch eine einfache INSERT-Anweisung für die Datenbank. Aber nix komplexes, sondern einfach nur eine Tabelle, wo sich das Script die Original-Datei-Namen in Verbindung mit den lokal gespeicherten Dateinamen merkt. Jesus Christus spricht: "Meine Kraft ist in den Schwachen mächtig." Geändert von wahnsinn (11.08.2010 um 13:19:38 Uhr) |
||||||
|
|
|
|
#4 (permalink) | ||
|
return void
|
Zitat:
Zitat:
Ich stelle mal Vermutungen auf: Dein Script erreicht das memory limit (FATAL ERROR) und du möchtest eine Datei öffnen, was wiederum Speicher benötigen würde, du hast aber bereits das memory_limit erreicht, weshalb wieder ein Fehler geworfen, somit springt dein error handler wieder an .... Edit: Bezogen auf deinen Edit: Hmm, vllt ist es auf Linux anders als auf Windows oder verschiedene PHP-Versionen, wer weiß, kannst es ja mal testen |
||
|
|
|
|
|
#5 (permalink) | |
|
Teilzeitcholeriker
|
Zitat:
Mac OS X, nicht Windows. Jesus Christus spricht: "Meine Kraft ist in den Schwachen mächtig." |
|
|
|
|
|
#6 (permalink) | |
|
bekämpft die Mächte des Bösen
|
Zitat:
Unabhängig vom konkreten Sachverhalt: Wenn PHP sich nicht rechtzeitig beendet, is das maximal ein Bug in PHP. Für den kann aber der Kunde nichts, selbst, wenn er Script einsetzt, dass ne Endlosschleife mit Festplattenattacke macht. Das is Job des Serveradministrators dafür zu sorgen, dass PHP aktuelle bugfreie Version installiert ist. |
|
|
|
|
|
|
#8 (permalink) |
|
bekämpft die Mächte des Bösen
|
Ich mein, wie soll es sonst sein?
Der Otto-Normal-Verbraucher-Kunde hat Webspace, wo er PHP-Scripts reinladen kann und ausführen kann. Meistens hat man noch nicht mal Zugriff zur php.ini, geschweige dem hat das Recht, Prozesse zu verwalten. Als Beispiel, wie es bei uns an der Uni läuft: Du kannst dort Prozesse starten, wie du willst. Aber egal, was du tust, ob sich der Browser aufhängt, du ein zu rechenintensives Programm geschrieben und gestartet hast, etc. etc. Der Process Checker schießt gnadenlos alles von dir ab, was den Betrieb stört. Du kriegst dann nur ne Mail, wo drinsteht, welcher Prozess warum abgeschossen wurde. So sollte es auch auf einem Webserver laufen (wo mehr als nur 2 oder 3 Studenten gleichzeitig arbeiten). Drum gibts ja extra die Berufe Netzwerkadministrator, Systemadministrator und das ganze Zeugs. Man sollte sich auskennen, wenn man so ne Kiste am laufen hat. Der Kunde tuts sicher nicht - und selbst wenn, er hat gar keinen Zugriff. |
|
|
|
|
|
#9 (permalink) |
|
Teilzeitcholeriker
|
Dankeschön für die Einschätzung. Jetzt bin ich noch über etwas gestolpert:
Laut phpinfo() läuft auf dem Server PHP 5.3.2. Auch dort aufgefallen ist mir die Option exit_on_timeout, diese ist scheinbar neu seit PHP 5.3 (http://php.net/manual/en/migration53.ini.php) Diese ist auf Off gesetzt, was wohl Standard-Auslieferungszustand ist. Allerdings hab ich keinerlei Anhaltspunkte gefunden, was diese Einstellung bewirkt. Kann es sein, dass diese verhindert dass das Script bei einem Timout-Error abbricht? Der Name lässt mich das ja annehmen. Aber einen Sinn dahinter kann ich nicht finden. Jesus Christus spricht: "Meine Kraft ist in den Schwachen mächtig." |
|
|
|
|
#10 (permalink) | |
|
return void
|
Zitat:
|
|
|
|
|
|
|
#11 (permalink) | |
|
Erfahrener Benutzer
|
Hi,
ich hatte mal ein ganz ähnliches Problem, welches jedoch nichts mit einem Timeout oder dem Error-Handler zu tun hatte... Zitat:
Möglicherweise hab ich's nicht richtig verstanden, aber: Warum für solche Aktionen im Errorhandler? Dieser ist doch dafür gedacht Fehler zu Handlen, um diese meinetwegen benutzerfreundlich auszugeben. So würde Deine Aufgabe bei JEDEM auftretenden Fehler durchgeführt werden...egal ob nun E_PARSE, E_NOTICE, etc... ist das so gewollt? Wenn ja, die Kopieraktion nur bei bspw. E_USER_NOTICE (den Du selbst setzen kannst) anlaufen lassen, und bei allen anderen ERRNOs per exit(); abbrechen, bzw. die Fehlermeldung regulär ausgeben lassen? |
|
|
|
|
|
|
#12 (permalink) | |
|
Teilzeitcholeriker
|
Zitat:
Weil ich für die ganze Synchronisation eine einzige Log-Datei haben will. Bei der dann auch drin steht, wenn der XML-Parser Probleme hat, oder irgendwo ein foreach() ohne Array aufgerufen wird. Jesus Christus spricht: "Meine Kraft ist in den Schwachen mächtig." |
|
|
|
|
|
#13 (permalink) | ||
|
CB-Webhosting.de
|
Zitat:
Zitat:
|
||
|
|
|
|
|
#14 (permalink) | |||
|
Erfahrener Benutzer
|
Zitat:
Zitat:
Zitat:
Wenn ich den Handler mittels trigger_error() ansprechen will geht nur E_USER_*, auch wenn ich innerhalb des Handlers erneut einen trigger_error($errmsg, $errno) aufrufe, passiert nix (PHP5.3.2). Doch...PHP macht intern irgendwann ein E_WARNING daraus, und bricht ab, weil trigger_error('foo', E_WARNING); nicht erlaubt ist. |
|||
|
|
|
![]() |
| Gesponsorte Links |
| Anzeige |
| Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
| Themen-Optionen | |
| Ansicht | |
|
|
Ähnliche Themen
|
||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| Fatal Error bei Smarty :/ | Raze | Programmierung | 2 | 28.07.2008 21:47:51 |
| [PHP] Fatal Error? | deniz | Programmierung | 17 | 19.06.2008 14:54:21 |
| Server nach einiger Zeit nach Neustart überlastet | Bububoomt | Programmierung | 10 | 13.12.2007 17:27:14 |
| fatal error | Goltergaul | Bug-Report | 1 | 29.09.2007 10:13:30 |
| [PHP] fatal error | ottscho | Programmierung | 10 | 02.05.2006 14:32:57 |