Henryk Plötz: Absturz mit Apache, PHP 4.0, MYSQL und WIN 2000

Beitrag lesen

Moin

schade. habe mir mühe gegeben, das problem halbwegs klar zu schildern

Das hast du eigentlich auch, nur leider bringt das bei der Fehlermeldung nicht viel. Mit "premature end..." beschwert sich eigentlich der Webserver bei CGI-Anwendungen aller Art, wenn diese es nicht geschafft haben die richtigen Header auszugeben. Offensichtlich ist PHP als abgestürzt noch bevor es etwas an den Apachen senden konnte. Hast du keine Möglichkeit PHP als Modul laufen zu lassen? Das würde vieles einfacher machen...

Na wie dem auch sei. Mir fallen einige Wege ein die dich hoffentlich der Lösung näher bringen. Du brauchst aber in jedem Fall eine Schrittfolge mit der du den Fehler garantiert hervorrufen kannst, sonst macht debugging einfach keinen Spaß. Auch wäre es vorteilhaft zunächst die neuesten Versionen aller beteiligten Komponenten zu installieren, dann kannst du dich vielleicht an die jeweiligen Entwickler wenden. Dazu brauchst du aber auch eine Schritt-für-Schritt-Anleitung zum Erstellen der fehlerverursachenden Tabelle bzw. einen Dump davon.
Also ohne besondere Reihenfolge und ungetestet:

1. Dass du php als CGI kompiliert hast, könnte ein Vorteil sein. Versuch php.exe ohne den Apachen aufzurufen und dabei dieselbe Umgebung herzustellen wie wenn php vom Apache aufgerufen werden würde. Vielleicht erhältst du dann eine Fehlermeldung auf die Kommandozeile oder einen anderen Hinweis. Wenn du nicht weisst was zum Zeitpunkt des PHP-Aufrufs in der Umgebung los ist, könntest du den Handler für php-Skript von php.exe auf eine selbstgeschriebene .bat-Datei setzen die alle Umgebungsvariablen und Kommandozeilenparameter protokolliert. Wenn du so erstmal einen Kommandozeilenaufruf von php.exe zusammengestellt hast, der den Fehler hervorbringt, kannst du den auch als .bat-Datei zusammenfassen und so später mit einem Doppelklick ausprobieren ob der Fehler behoben ist.

2. Es besteht die Chance, dass der Fehler während der Skriptausgabe auftritt und PHP zu diesem Zeitpunkt schon ein paar Ausgaben angesammelt und noch nicht an den Apachen, bzw. der Apache noch nicht an den Browser weitergeleitet hat. Um dem entgegenzuwirken kannst du versuchen alle Zwischenpuffer die du in irgendeiner Konfigurationsdatei findest, abzuschalten. Für die php.ini kenne ich zwar keinen solchen Eintrag, aber als Workaround sollte es helfen mit der Konfigurationsdirektive auto_prepend_file (http://www.php.net/manual/en/configuration.php) eine einfache PHP-Datei zu laden die das erledigt. Etwa in der Art von
<?php ob_implizit_flush(); ?>
Damit wird PHP in jedem Fall gezwungen alles an den Apache zu senden. Sei vorsichtig: Wenn du in dieser Datei Leerzeichen/-zeilen außerhalb der <?php ?> hast, geht das Outputten sofort los und alle Header die phpMyAdmin evt. senden will, funktionieren nicht mehr. Du kannst natürlich auch absichtlich die Ausgabe in dieser Datei starten, wenn du die Ausgabe der Header erzwingen willst. Das könnte evt. weiteren Aufschluss geben.
Wenn du etwas mehr mit PHP vertraut bist, kannst du hier auch noch weitere Debugging-Funktionen unterbringen. Eine Möglichkeit wäre etwa über register_shutdown_function() (http://www.php.net/manual/en/function.register-shutdown-function.php) eine Funktion einzubinden die beim Skriptabbruch debugging-Informationen sichert (etwa den letzten mysql-Fehler ([linkhttp://www.php.net/manual/en/function.mysql-error.php:]) oder die letzte PHP-Fehlermeldung (http://www.php.net/manual/en/configuration.php  track_errors einschalten), falls php.exe denn nicht gleich völlig abschmiert.

So, ich hoffe jetzt hast du erstmal genügend Ansätze :)

das apache-error-log hat zum auftreten des fehlers wenig zu bieten:
[Sun Dec 02 23:31:16 2001] [error] [client 127.0.0.1] Premature end of script headers: d:/php/php.exe

s.o. Die Fehlermeldung ist ziemlich unspezifisch.

Beim Durchgehen des logs fällt mir aber auf, daß sich immer wieder (im Abstand von ca 10 Minuten) folgende Blöcke finden:
[Mon Dec 03 19:57:07 2001] [error] [client 217.83.103.229] File does not exist: d:/mjkserver/htdocs/scripts/root.exe
[Mon Dec 03 19:57:10 2001] [error] [client 217.83.103.229] File does not exist: d:/mjkserver/htdocs/d/winnt/system32/cmd.exe
Kannst Du Dir das erklären?

Die Frage hattest du weiter oben schon beantwortet gekriegt. Fürs Archiv: Das sind Wurm-Spuren die im Zusammenhang mit Code Red-Angriffen bzw. Checks auf Hintertüren die von Code Red installiert wurden, auftreten. Solange du deinen Apachen nicht durch einen ungepatchten IIS ersetzt, besteht kein Grund zur Sorge.

PHP Version 4.0.6, MySQL 3.23.45-nt
phpMyAdmin 2.2.2 (produziert viele Fehler)
phpMyAdmin 2.1.0 (produziert wenige Fehler)

--
Henryk Plötz
Grüße aus Berlin