3 Stimmen

Wie kann ein Ausgabepuffer die Leistung verschlechtern?

Ich schreibe ein PHP-Skript und irgendwo vor meinem header() Funktion habe ich Text in den Browser gedruckt, wodurch meine header() Funktion gibt mir einen bekannten Fehler:

Warnung: Cannot modify header information - headers already sent.

Meine Frage ist nun, dass ich die Absicht habe, die ob_start() y ob_flush() vor und nach der header() Funktion. Aber ich habe einmal gehört, dass ein Ausgabepuffer die Leistung einer Anwendung negativ beeinflussen kann. Wie wahr ist das?

Oder sollte ich nur Stick mit der Idee des Druckens Javascript-Funktion, um die Seite umzuleiten.

Vielen Dank für Ihre Zeit.

5voto

strager Punkte 86191

Wir sollten die kleinen Effizienzgewinne vergessen, die in etwa 97 % der Fälle erzielt werden: Vorzeitige Optimierung ist die Wurzel allen Übels.

Test ob_start und Freunde, um zu sehen, ob der Leistungsunterschied ins Gewicht fällt. Wenn ja, sollten Sie sich nach Alternativen umsehen.

Die einfachste Möglichkeit ist das Verschieben der header() vor dem Druck anrufen.

Da Sie wahrscheinlich eine Weiterleitung mit etwas wie:

header('Location: /new/location/');

Vorher sollten Sie nichts ausdrucken header() aufzurufen, weil der Client ohnehin nichts mit den von Ihnen gedruckten Daten anfangen würde (es sei denn, ich übersehe etwas bei HTTP).

(Javascript ist keine gute Option für Weiterleitungen, und auch die meta erfrischend, es sei denn, Sie wollen Javascript aus irgendeinem Grund erkennen.)

4voto

David Z Punkte 121773

Die Verwendung eines Ausgabepuffers erfordert, dass der Server die gesamte PHP-Ausgabe im RAM speichert. Wenn es sich also um eine große Seite handelt, wird eine ganze Menge Speicher verbraucht - und der Server muss außerdem warten, bis die gesamte Seite generiert ist, bevor er sie sendet, was zu einer kleinen Verzögerung führen kann. Aber abgesehen davon glaube ich nicht, dass die Verwendung eines Ausgabepuffers einen großen Nachteil darstellt. Für das, was Sie tun wollen, ist es sicherlich eine vernünftige Lösung.

2voto

Sergey Galashyn Punkte 6908

Das Verschieben des PHP-Codes nach der Ausgabe kann auf ein schlechtes Anwendungsdesign hinweisen. Aber ich weiß nicht, Ihre Situation und kann zwei mögliche Wege vorschlagen.

  1. Aufteilung des Codes in Modell (Datenverarbeitung) und Ansicht (Ausgabe) (siehe MVC ). Das bedeutet, dass Sie eine Entscheidung über einen Umzug treffen, noch bevor Sie etwas angezeigt haben. Ich würde diesen Weg als bevorzugt bezeichnen.
  2. Wenn Sie realmente die Ausgabe (oder andere gesendete Header) anzeigen müssen, ist es üblich, JS und HTML (in noscript) zu kombinieren:

    if (headers_sent()) {
        print('<script type="text/javascript">( document.location.replace ) ? document.location.replace("'.$location.'") : document.location.href = "'.$location.'";</script>'."\n".'<noscript><meta http-equiv="Refresh" content="0;URL='.$location.'" /></noscript>');
    } else {
        header('Location: '.$location);
        exit;
    }

P.S. Dieser Code ist ein Teil des Fusebox-Frameworks.

0voto

SilentGhost Punkte 285785

Um Ihre letzte Bemerkung zu beantworten: Sie können die Seite in php umleiten, indem Sie header('Location: '.$url) Sie sollte natürlich vor jeder anderen Ausgabe erfolgen und es wird empfohlen, dass sie von exit();

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X