kostenloser Webspace werbefrei: lima-city


[PHP] ob_start()

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    s***h

    Hi,
    ich hab mich über die Funktion ob_start() informiert, aber leider bleiben da noch Fragen offen:

    1. Was muss in einem Script zuerst erfolgen session_start() oder ob_start()?

    2.
    Ich habe gelesen, dass ob_start() schneller ist, als normale echo Ausgaben. Außerdem ist es auch schneller, wenn man zuerst die Ausgabe in einer Variabel speichert, als wenn man alles gleich ausgibt.
    Meine Frage: Wenn man beides kombiniert, kann man so das Script noch weiter beschleunigen?

    Welches der nachfolgenden Varianten ist schneller?
    ob_start();
    echo "123...";
    echo "7890";
    ob_end_flush();

    ob_start();
    $echo = "123...";
    $echo = "7890";
    echo $echo;
    ob_end_flush();


    3. Darf ich vor ob_start() Befehle ausführen wie z.B ein paar Definitionen, zur DB connecten oder mySQL-Abfragen?

    4. Kann ich irgendwie überprüfen, ob der Puffer auch wirklich zustande kam?
    Wenn ich nämlich ob_end_flush() weglasse, dann wird das Script trotzdem wie gewohnt ausgeführt.
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Ich hab mal gelesen session_start() muss immer als Erstes stehen. Aber ich muss zugeben ich weiss nicht, was ob_start() ist ;)
  4. benutzernaemelchen

    Kostenloser Webspace von benutzernaemelchen

    benutzernaemelchen hat kostenlosen Webspace.

    Also ich schreib immer ob_start() als erstes und hatte noch nie Probleme.

    Zu 2.:
    Die Ausgaben sind IMHO nichtmal die selben. Bei der zweiten variante weist du der Variable 2mal einen Wert zu. es wird also eigentlich nur "7890" ausgegeben, während im ersten Beispiel beide Ausgaben herauskommen(sollten).


    3: Wieso? Sollte eigentlich gehen. Der Sinn ist mir nur schleierhaft :P

  5. e********l

    ob_start() benutzt du, wenn du zb. ein eigenes Template System geschrieben hast oder die Ausgabe unterdrücken musst während du Cookie verarbeitest, aber schon bereits Code an den Client gesendet wurde.

    mit ob_get_contents() erhälst du den Inhalt aus dem Buffer zurück.

    Beschleunigen tut es das ganze eigentlich nicht, da der Inhalt deiner Seite zunächst in einem BUffer auf dem Server gespeichert wird und erst mit ob_flush() an den Client geschickt wird oder entsprechend am Ende der Seite automatisch.

    session_start() sollte bei Verwendung von Sessions mit als erstes überhaupt vor allem anderen aufgerufen werden. Ich ruf das meist gleich nach dem setzen der Locale Settings auf und danach kommmt meist die Initialierung des Restes wie Config, SQL, Debugger und was man so alles brauch.
  6. t*****b

    session_start() muss immer vor der Ausgabe (egal ob per echo, include oder einfach als HTML in der PHP-Datei) stehen! Jedoch kann man dem ausweichen, wenn man ob_start() verwendet, bsp:

    So würde es richtig sein:
    <?
    session_start();
    ...
    echo "hallo welt";
    ?>


    So ist es falsch:
    <?
    echo "hallo welt";
    ...
    session_start();
    ?>


    und es kommt zu einem Fehler. Dies kann man mit ob_start() umgehen:
    <?
    ob_start();
    echo "Hallo Welt";
    ob_end_flush();
    session_start();
    ?>
  7. Autor dieses Themas

    s***h



    Zu 2.:
    Die Ausgaben sind IMHO nichtmal die selben. Bei der zweiten variante weist du der Variable 2mal einen Wert zu. es wird also eigentlich nur "7890" ausgegeben, während im ersten Beispiel beide Ausgaben herauskommen(sollten).



    Ups wollte eigtl $echo .= "asas"; schreiben.

    Ich habe folgendes gelesen:
    http://www.ilimitado.de/blog/programmierung/performance-vorteil-output-buffer/

    Und da dachte ich, dass man variante 2 & 3 evtl kombinieren könnte..


    Beitrag geändert: 4.7.2007 17:08:52 von sesch
  8. e********l

    Der Benchmark ist zu syntetisch als das er was taugt. Im Idealfall setzt man echolastige Inhalte zunächst in einer Variable zusammen und gibt die dann einmal aus.
  9. Autor dieses Themas

    s***h


    Der Benchmark ist zu syntetisch als das er was taugt. Im Idealfall setzt man echolastige Inhalte zunächst in einer Variable zusammen und gibt die dann einmal aus.


    Also würdest du die 2. Variante bevorzugen?

    PS: Weiß jmd ne Antwort zu 4.?
  10. e********l

    Das ist von Situation zu Sitation unterschiedlich und musst du abwägen.

    @4: Stand eigentlich schon in meinem ersten Post, einfach ob_get_contents() aufrufen. Der liefert dir den Buffer zurück. Ist der Buffer aktiv gibt es einen String zurückgeliefert, ist der Buffer nicht aktiviert, weil zb. ob_start() nicht aufgerufen wurde, dann bekommst false zurückgeliefert.
  11. a******9

    1. ob_start zuerst ist doch logisch. Erst alle Ausgaben abfangen. Meist wird ja bei Session automatisch n Cookie gesetzt.

    2. ka.

    3. Klar. Ich würde sagen, dass es sogar sinnvoll ist, weil wenn dabei ein Fehler auftritt muss garnicht erst alles gebufferd werden!

    4. Mach doch zum Beispiel
    if(!empty(ob_get_contents())) {
    // Buffer zustande gekommen
    } else {
    // Buffer NICHT zustande gekommen :(
    }
  12. Autor dieses Themas

    s***h


    1. ob_start zuerst ist doch logisch. Erst alle Ausgaben abfangen. Meist wird ja bei Session automatisch n Cookie gesetzt.

    2. ka.

    3. Klar. Ich würde sagen, dass es sogar sinnvoll ist, weil wenn dabei ein Fehler auftritt muss garnicht erst alles gebufferd werden!

    4. Mach doch zum Beispiel
    if(!empty(ob_get_contents())) {
    // Buffer zustande gekommen
    } else {
    // Buffer NICHT zustande gekommen :(
    }



    1. Wuahh? was jetzt? da gehen die Meinungen offenbar stark auseinander ^^

    4. Wenn ich das hier nehme:
    if(!empty(ob_get_contents())) {
    echo "ja";
    } else {
    echo "nein";
    }

    kommt folgender Fehler:
    Fatal error: Can't use function return value in write context in D:\Programme\xampp\htdocs\login.php on line 215

    Beitrag geändert: 4.7.2007 18:25:33 von sesch

  13. und es kommt zu einem Fehler. Dies kann man mit ob_start() umgehen:
    <?
    ob_start();
    echo "Hallo Welt";
    ob_end_flush();
    session_start();
    ?>



    Du meinst sicherlich

    ob_start();
    echo "Hallo Welt";
    session_start();
    ob_end_flush();

    Ansonsten würdest du die typische "headers already sent"-Fehlermeldung kriegen.
  14. eine HTML Seite wird über das HTTP Protokoll vom Server an den Browser geschickt. In so einem HTTP Paket sind außer dem HTML Quellcode noch so genannten Header Daten dabei (Cookies, Serverdaten etc...) Dieser Headerdaten müssen oben im Paket stehen, im Anschluss kommt der Datenteil.
    Verschickt werden HTTP Pakete gepackt in mehrere TCP Pakete (welche per IP Adresse verschickt werden) (Sozusagen bekommt der Client erstmal ein TCP Paket welches im sagt warte kurz gleich kommt was, dann kommen viele Pakete die ausgepackt und zu einem langen HTTP string gebaut werden, irgendwann, wenn das PHP Script am Ende ist sendet der Server ein TCP -FIN Paket, das teilt dem Client mit da kommt ncihts mher zeige im Browser an was du bekommen hast.)
    Sobald PHP einen echo Befehl sieht wird so ein Paket gepackt und gesendet. Das setzt aber voraus, dass der HTTP Header bereits gesendet ist, da nicht erst Daten dann Header gesendet werden können.
    Also schickt PHP beim ersten echo/print erst mal die Header Daten los und die Ausgabe dann hinterher.
    Danach kann am Header nichts mehr geändert werden. Deswegen kein session_start() mehr möglich, da die Cookies schon abgeschickt sind.
    Um im gesamten PHP Skript Cookies und HTTP Header manipulieren zu können startet man gleich als erstes im Script den Outputbuffer, sammelt darin alle Ausgaben und gibt sie am Script Ende aus.
    Das sinnvollste ist aber alle Ausgaben in einer Variablen zu sammeln und diese am Ende des Scriptes auszugeben.
    Dann kann man den Outputbuffer nutzen um zu prüfen ob im Script Fehler auftraten, denn auch Fehlermeldungen werden im HTTP Datenteil gesendet. Buffert man sie im Outputbuffer kann man prüfen ob dieser Leer ist (keine Fehler) oder ob was drin steht. das geht aber nur so:
    $output = ob_get_contents(); //Bufferdaten in Variable speichern
    ob_end_clean(); //Buffer verwerfen ohne zu senden
    if(!empty($output)) {
    echo "Fehler: $output";
    } else {
    echo "Keine Fehler"; //bzw. echo $ergebnis
    }


    Der Geschwindigkeitsvorteil die Ausgaben von vielen echos zu buffern ergibt sich vor allem dadurch, dass nicht ständig TCP Pakete gesendet werden, sondern einmal am Ende.
  15. e********l

    Es bringt aber keinen wirklichen Geschwindigkeitsvorteil, wenn man noch hunderte echo's im Code hat, denn für diese muss der PHP Parser jedesmal die echo Funktion aufrufen und das bremst auf Dauer. Das wird jetzt nicht bei kleinen Applikationen passieren,aber wenn mal eben 3000 Zeilen PHP Code und mehr pro Seitenaufruf verarbeitet werden ist das eine Zeitkritische Angelegenheit.
  16. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!