Michael Schröpl: Premature end of script headers..

Beitrag lesen

Hi,

ich nutze den Apache-Webserver 1.3.22 mit PHP 4.0.6 auf einem
Windows-2000-Pro-Rechner.
Soweit ist alles "richtig" konfiguriert, und ich habe mehrere
VirtualHosts eingerichtet, die auch alle meinen Wünschen gemäß
funktionieren.
Nun sollen jedoch PHP-scripte aus einem Verzeichnis
"e:/xyz/www/skripte/" heraus laufen - dieses kommentiert mir
Apache mit einem "Premature end of script headers".

Diese Aussage halte ich für nicht korrekt.

Beide Teil-Aussagen mögen wahr sein, aber ein unmittelbarer Zusammenhang
ist meiner Meinung nach nicht gegeben.
a) Ja, Du magst PHP so konfiguriert haben.
b) Ja, der Apache produziert diese Meldung bei der Ausführung Deines
   Skripte.

Versuchen wir doch erst mal, diese Meldung zu verstehen.
"Premature end of script headers" bedeutet "vorzeitiges Ende der Header,
welche von diesem Skript erzeugt wurden".
Gemeint sind in diesem Falle die HTTP-Header, welche das an den Browser
gesendete Paket einleiten und dessen Inhalt beschreiben.
Und das bedeutet für mich, daß Deine Apache-Konfiguration mit hoher
Wahrscheinlichkeit nicht die Fehlerursache darstellt. (Es gibt immer
noch Möglichkeiten in dieser Richtung, welche aber von der Art Deines
PHP-Skripts abhängen.)
Wäre beispielsweise nur der Inhalt der Skript-Datei aufgrund einer
Fehl-Konfiguration als Klartext an den Browser geschickt worden, dann
hätte der Apache automatisch einen korrekten HTTP-Header davor gesetzt.
Daraus schließe ich immerhin, daß Dein PHP-Skript _ausgeführt_ wurde.

Daß dies nicht geschehen ist, läßt mich als sicher annehmen, daß der
erzeugte HTTP-Header nicht vom Apache-Kern stammt, sondern von etwas,
das Du diesem hinzugefügt hast.
Dafür gibt es m. E. zwei wahrscheinliche Kandidaten:
a) Dein PHP-Skript selbst (das könnte einen Programmierfehler enthalten
   und eine Fehlermeldung ausgeben, welche natürlich nicht die Syntax
   eines korrekten HTTP-Headers erfüllt). Ein guter Kandidat für so
   etwas könnte beispielsweise ein Pfadname sein, der auf Deinem Server
   nicht paßt.
b) Dein PHP-Modul (das könnte fehlerhaft installiert sein, irgendwelche
   Ressourcen nicht finden, ebenfalls eine Fehlermeldung ausgeben, siehe
   oben).

Problem a) könntest Du dadurch zu bekämpfen versuchen, daß Du in Deinem
PHP-Skript als allererstes - vor jeglichen anderen Operationen - einen
korrekten HTTP-Header ausgibst (z. B. "Content-type: text/html\n\n").
Was immer anschließend eventuell als Fehlermeldung ausgegeben wird,
würdest Du im Browser lesen können.

Problem b) zu lokalisieren ist ohne direkten Zugriff auf den Server
schwieriger. In diesem Fall - wie in fast allen Fällen - ist der Inhalt
des Apache-error_log ungeheuer hilfreich. Ohne diesen ist die Fehlersuche
bei Server-Programmierung erstens Kristallkugelanwendung und zweitens
unnötige Selbstverdummung: Das error_log ist genau dafür da, um Dir im
Falle eines Fehlers zu sagen, was passiert ist!
Also mußt Du zuallererst dort hinein schauen, wenn irgendwas nicht tut.

Meine Frage lautet nun : Ich habe die httpd.conf des Apache nur
meinen Örtlichkeiten angepasst ("DocumentRoot", "Servername" etc.),
und diese Angaben in den VirtualHosts-Containern entsprechend der
Speicher-Verzeichnisse für die http-Dokumente geändert.
Muß ich nun noch irgendwelche "Rechte" bei den VirtualHosts-
Definitionen in die httpd.conf eintragen wie etwa "ExecCGI"?

Das kommt darauf an, wie Du PHP eingebunden hast. Dafür gibt es m. E.
mehrere Möglichkeiten - sowohl eine, die den PHP-Interpreter über die
CGI-Schnittstelle einbindet (Stefan Münz hat erst letzte Woche hier
gepostet, dies sei das Einsatzmodell, das auf dem Rechner des Self-
Portals genutzt wird), als auch eine andere, die PHP als Modul des
Apache einbindet (was ggf. performanter, aber deutlich RAM-intensiver
ist).
Ein Kommentar zu Deiner Apache-Konfiguration würde genauere Angaben
von Deiner Seite erfordern. Ich bin selbst kein PHP-Benutzer - ich
kann Dir lediglich sagen, wie der Apache funktioniert, und an dessen
Funktionsprinzipien muß sich auch PHP auf die eine oder andere Weise
halten.

Habe ich schon einmal probiert, doch anscheinend fehlt mir der
Überblick über das gesamte.

Ich halte die PHP-Einbindung nicht für völlig trivial (um sie wirklich
zu verstehen und nicht nur irgendwas einzuschalten, sind durchaus ein
paar detaillierte Kenntnisse über den Apache erforderlich) - also:
Kopf hoch, das geht nicht sofort völlig ohne Lernen. Aber es geht.

Denn: Wird das gleiche Script aus dem Stamm-httpd-Verzeichnis des
Webservers heraus gestartet, dann funktioniert es.

Das ist immerhin eine interessante Information - aber sie reicht mir
nicht, um daraus zu schließen, ob das Problem im PHP-Skript oder in
der Apache-Konfiguration liegt. Falls Du beispielsweise irgendwelche
Dateien über relative Pfade zu adressieren versuchen solltest, würde
der Installatios-Ort Deines Skripts genau den Unterschied ausmachen.

Wir suchen letzten Endes einen Fehler in Deinem Skripts - davon gehe
ich aus, weil der Apache das Skript auf jeden Fall schon mal ausführt
(und zwar in jedem der beiden genannten Verzeichnisse, nur eben mit
unterschiedlichem "Erfolg").

Vorgeschlagene Maßnahmen:
1. error_log lesen und Meldung hier posten
2. Dein Skript lesen und überlegen, ob Du von irgendwelchen externen
   Ressourcen abhängig bist, die nur unter bestimmten Bedingungen
   verfügbar sind.

Viele Grüße
      Michael