snorri: Welche Einstellung beeinflusst "headers already sent"?

Hi alle,

wohl jeder, der sich ein bisschen mit PHP beschäftigt, stolpert irgendwann über diese Meldung "Warning: Cannot modify header information - headers already sent ...", wenn man versehentlich etwas ausgibt und dann header() verwendet.

Was mich gerade wundert: Ich habe so einen Bug produziert, der aber auf meinem Testserver zu keiner Warnmeldung führt (und auch die Umleitung per header() funktioniert), wohl aber online. Gibt es eine PHP-Einstellung, die festlegt, ob das geprüft wird?

(Mein error_reporting am Testserver steht auf "E_ALL & ~E_NOTICE", sollte die Warning also eigentlich ausgeben. PHP ist Version 5.2.6.)

Danke im Voraus!

-- snorri

  1. Hallo,

    wohl jeder, der sich ein bisschen mit PHP beschäftigt, stolpert irgendwann über diese Meldung "Warning: Cannot modify header information - headers already sent ...", wenn man versehentlich etwas ausgibt und dann header() verwendet.

    nicht unbedingt - die Header vor dem Nutzinhalt zu senden, sollte eigentlich selbstverständlich sein.

    Gibt es eine PHP-Einstellung, die festlegt, ob das geprüft wird?

    Nein. Aber bei dir könnte Output Buffering aktiv sein - also dass PHP erst alle Nutzinhalte zwischenspeichert und erst am Scriptende wirklich ausgibt. Dann kann man auch jederzeit im Script noch Header in die Warteschlange stellen.

    (Mein error_reporting am Testserver steht auf "E_ALL & ~E_NOTICE"

    Da sollte es aber eigentlich auf E_ALL stehen (E_NOTICE eingeschlossen).

    So long,
     Martin

    --
    F: Was ist wichtiger: Die Sonne oder der Mond?
    A: Der Mond. Denn er scheint nachts. Die Sonne dagegen scheint tagsüber, wenn es sowieso hell ist.
    1. Hello,

      ... und außerdem kann er im Script, bevor (weitere) Header eingetragen werden in die interne Tabelle, auch die Funktion headers_sent()
      [http://de3.php.net/manual/en/function.headers-sent.php]
      abfragen, die den Sendestatus kennt.

      Wenn die true liefert, ist es schon zu spät.

      Liebe Grüße aus dem schönen Oberharz

      Tom vom Berg

      --
      Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de
      1. Hallo Tom,

        ... und außerdem kann er im Script, bevor (weitere) Header eingetragen werden in die interne Tabelle, auch die Funktion headers_sent() abfragen, die den Sendestatus kennt.

        danke, das wusste ich auch noch nicht. Vielleicht kann man das ja wirklich mal gebrauchen ...

        Schönes Wochenende,
         Martin

        --
        Die letzten Worte des Privatdetektivs:
        Jetzt wird es mir klar: SIE sind der Mörder!
      2. Hallo Tom,

        Nützlicher Tipp, auch von mir ein Danke!

        -- snorri

    2. Hallo Martin!

      bei dir könnte Output Buffering aktiv sein

      Hab grad mal nachgeschaut, da steht in der php.ini: "output_buffering = 4096". Wenn ich das auf "0" setze oder auskommentiere ändert sich am Verhalten allerdings nichts.

      (Mein error_reporting am Testserver steht auf "E_ALL & ~E_NOTICE"
      Da sollte es aber eigentlich auf E_ALL stehen (E_NOTICE eingeschlossen).

      Gute Idee.

      -- snorri

      1. Hallo,

        bei dir könnte Output Buffering aktiv sein

        Hab grad mal nachgeschaut, da steht in der php.ini: "output_buffering = 4096". Wenn ich das auf "0" setze oder auskommentiere ändert sich am Verhalten allerdings nichts.

        Du musst Output Buffering explizit starten, dazu dient ob_start().

        Freundliche Grüße

        Vinzenz

        1. Hi,

          bei dir könnte Output Buffering aktiv sein
          Hab grad mal nachgeschaut, da steht in der php.ini: "output_buffering = 4096". Wenn ich das auf "0" setze oder auskommentiere ändert sich am Verhalten allerdings nichts.
          Du musst Output Buffering explizit starten, dazu dient ob_start().

          wäre nicht die viel spannendere Frage, wie er das Output Buffering auf seinem Testsystem *aus*schaltet? So wie ich den OP verstanden habe, tritt die Meldung auf seinem Produktivserver auf, aber nicht auf seinem Testsystem, und er versucht nun, die Konfiguration auf seinem Testserver anzugleichen.

          Mir ist aber keine PHP-Einstellung bekannt, die Output Buffering einfach so aktiviert, ohne dass man das explizit mit ob_start() initiiert.

          So long,
           Martin

          --
          Arzt:    Gegen Ihr Übergewicht hilft wohl nur noch Gymnastik.
          Patient: Sie meinen, Kniebeugen und so?
          Arzt:    Nein, Kopfschütteln. Immer dann, wenn Ihnen jemand was zu essen anbietet.
          1. hi,

            Mir ist aber keine PHP-Einstellung bekannt, die Output Buffering einfach so aktiviert, ohne dass man das explizit mit ob_start() initiiert.

            Zählt da auch die php.ini konfiguration?

            Ich habe in meinen ini-Dateien stets ein

            output_buffering = ON
            zlib.output_compression = ON

            und hatte seit der verwendung dieser Einstellungen nie Probleme mit headern.

            P.s.: Unter Windows-Xampp und PHP als CGI muss man den Server neu starten, damit diese Einstellungen übernommen werden.

            mfg

            --
            Word!
          2. Hello,

            [...]

            da spielen die Einstellungen 'implicit_flush' und 'output_buffering' mit...

            Liebe Grüße aus dem schönen Oberharz

            Tom vom Berg

            --
            Nur selber lernen macht schlau
            http://bergpost.annerschbarrich.de