Baba: headers_sebt(); - unterschiedl. Verhalten lokal und online

Folgendes Minimalbeispiel:

<?php  
header("content-type:text/html; charset=utf-8");  
flush();  
var_dump(headers_list());  
var_dump(headers_sent());  
?>  

Lokal gibt das schön:

array  
  0 => string 'X-Powered-By: PHP/5.3.5' (length=23)  
  1 => string 'content-type:text/html; charset=utf-8' (length=37)  
  
boolean true  

und online

array(2) {  
  [0]=>  
  string(24) "X-Powered-By: PHP/5.3.10"  
  [1]=>  
  string(37) "content-type:text/html; charset=utf-8"  
}  
bool(false)

Die Frage bezieht sich auf das boolean von headers_sent().  Vielleicht habe ich das einfach nicht verstanden. Ich benutzte diese Funktion in meiner shutdownfunktion. Diese macht sowas wie: "wenn der Header noch nicht raus ist, drucke die Fehlermeldung mit in die Ausgabe. Ansonsten schreibe Sie nur in die Logdatei". Leider geht sie immer davon aus, dass der Header noch nicht gesendet wurde.

Übrigens: ohne flush() verhält sich auch das lokale Beispiel so.

Bitte kann mich jemand aufklären.

Cheers,
Baba

  1. [latex]Mae  govannen![/latex]

    Übrigens: ohne flush() verhält sich auch das lokale Beispiel so.

    Vielleicht wirst du Opfer der Problematik, die in der Beschreibung von flush() beshcrieben ist.

    Bitte kann mich jemand aufklären.

    Also, da gibt es die Blumen und die Bienen...

    Stur lächeln und winken, Männer!
    Kai

    --
    It all began when I went on a tour, hoping to find some furniture
     Followed a sign saying "Beautiful Chest", led to a lady who showed me her best)
    SelfHTML-Forum-Stylesheet
  2. Tach!

    Bitte kann mich jemand aufklären.

    Ich kann es (noch) nicht. Aber ich würde jetzt die beiden phpinfo()-Ausgaben miteinander vergleichen, vor allem den allgemeinen Teil und da besonders die Werte, die sich mit Ausgabepufferung beschäftigen. Zudem wäre die Einbindung PHPs im Webserver interessant ((F)CGI/Modul).

    dedlfix.

    1. Hallo ihr beiden. Ich konnte das Problem dank eurer Antworten lösen:

      PHP läuft auf dem X-Server als FastCGI. Die php Konfiguration sagt zb
      output_buffer = on // bei beiden
      implicit_flush = off // bei beiden

      Vielleicht wirst du Opfer der Problematik, die in der Beschreibung von flush() beshcrieben ist.

      Erst dachte ich, Du meinst diesen Satz:
      Einige Webserver, besonders auf Windows (Win32), puffern ihre Scriptausgaben weiterhin bis zum Scriptende bevor sie sie zum Browser übertragen.
      Dann wäre ja aber sowas wie headers_sent() komplett unnütz, da der Header _nie_ vor Scriptende gesendet?!?

      Ich las dann auch:
      Es hat auch keinen Einfluss auf mit ob_start() erstellte Ausgabebuffer. Daher müssen Sie sowohl ob_flush() als auch flush() aufrufen, um die Ausgabebuffer zu leeren.

      Mit einem zusätzlichen ob_flush() konnte ich den gewünschten Effekt erzielen. Auch wenn ich es nicht ganz verstanden habe :(
      Ich start ja keinen Ausgabepuffer manuell mit ob_start() im Minimalbeispiel. Vielleicht kann ja jemand noch was schlaues dazu sagen...

      Vielen Dank.

      Cheers,
      Baba

      1. Hi,

        Mit einem zusätzlichen ob_flush() konnte ich den gewünschten Effekt erzielen. Auch wenn ich es nicht ganz verstanden habe :(
        Ich start ja keinen Ausgabepuffer manuell mit ob_start() im Minimalbeispiel.

        Nicht manuell, sondern:

        Die php Konfiguration sagt zb
        output_buffer = on

        MfG ChrisB

        --
        RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
        1. Danke, euch beiden!
          Habe das Offensichtliche hier übersehen :)
          Vielen dank!

          Cheers,
          Baba

      2. Tach!

        output_buffer = on // bei beiden

        Damit hast du einen Ausgabepuffer, in den erstmal hineingeschrieben werden kann, bis er voll ist. Solange können die Header noch zurückbehalten werden. Erst wenn die Ausgabe wirklich startet, müssen die Header gesendet werden.

        dedlfix.