2016-04-06 14 views
0

Ich habe gerade meine Website auf GoDaddy-Hosting umgestellt und alles funktioniert, aber die PHP-Skripte geben die Daten nicht sofort aus - sie puffern, bis das Skript fertig ist und dann die ganze Seite auf einmal rendert. Und natürlich, für lange Skripte, ist das ein Problem. Bei meinem alten Host lief es nicht so, und die GoDaddy-Unterstützung sagt, dass sie damit nicht helfen können. Hier ist, was ich habe schon versucht (ohne Erfolg)Wie kann ich die Ausgabepufferung in PHP bei gemeinsamem Linux-Hosting deaktivieren?

  1. Disabled Ausgang Kompression (zlib, gzip)
  2. Set output_buffering = off in php.ini
  3. Set-Header für Cache-Control "max-age=0, no-cache, no-store, must-revalidate", Pragma "no-cache", Expires "Wed, 10 May 1985 09:00:00 GMT" und ungesetzt die ETag Header
  4. ich habe auch versucht die Pufferung Werte im Skript Einstellung selbst, mit ini_set('output_buffering', 'off'), ini_set('zlib.output_compression', false), while (@ob_end_flush()), ini_set('implicit_flush', true) und ob_implicit_flush(true)
  5. Und ich versuchte, läuft flush() und ob_flush() Befehle nach jedem echo Ausgang
  6. die PHP-Version aus dem Standard-Versuchte Veränderung (5,4 nativen, die APC aktiviert hat) auf 5,4 nicht-native und 5,5

ich auch erstellt ein Testskript, das einfach für 5 Iterationen eine Schleife bildet und bei jeder Iteration eine Zeile ausgibt, dann eine Sekunde vor der nächsten Iteration wartet. Ich habe dies getan, um andere mögliche Ursachen von Problemen zu beseitigen. Aber egal, was ich mache, das Skript wartet immer bis zum Abschluss, bevor es mit dem Rendern beginnt.

Also, gibt es etwas, was ich tun kann, damit es richtig funktioniert?

+1

Wenn die Deaktivierung von GZIP und die Verwendung von "ob_flush" und "flush" nicht funktioniert, ist möglicherweise mehr los. Vielleicht ein Reverse Proxy oder sowas. –

+0

^^ Das scheint wahrscheinlich. Wie lange dauert es, bis eine Zeile Text wiedergegeben wird? –

+0

Ich bin mir nicht sicher, was du mit "wie lange" meinst. Wenn ich nur ein Skript mache, das eine Zeile druckt, ist das fast augenblicklich. – user496854

Antwort

0

Das erste, was zu beachten ist, dass, wenn Sie in das Deaktivieren alle Pufferung Erfolg haben, werden Sie Ihre kürzere Skripten much slower. Weitere machen, schrittweise an den Browser die HTML-Spülung führt nicht automatisch in den Inhalt im Browser gerendert wird ; Sie haben möglicherweise die pufferende Server-Seite erfolgreich umgangen, nur um festzustellen, dass sie noch im Browser gepuffert ist. Versuchen Sie, den Datenverkehr mit einem Paket-Sniffer zu überwachen, um herauszufinden, ob dies der Fall ist. Es ist möglich, den Inhalt progressiv mit Chunked Encoding gerendert zu bekommen, aber trivial.

Wie Sie scheinen zu wissen, Pufferung wird in der Regel in der Schnittstelle zwischen PHP auftreten und dem Webserver, der mit ausgespült werden können:

while(ob_get_level()) { 
    ob_end_flush(); 
} 
flush(); 

Genau, wenn Sie den Inhalt bündig einen großen Einfluss auf die Leistung. Wenn es einen Vorteil von früher Spülung zu haben gibt, dann ist es typischerweise nur nach dem Kopf .../Kopfabschnitt.

Um den Inhalt effektiv zu komprimieren, puffert der meiste Webserver die Daten. Sie sagen nicht, welchen Webserver Sie verwenden, aber wenn Apache 2.x verwendet wird, können Sie die Größe dieses Puffers (um der Größe des Chunks vor dem Flush zu entsprechen) über die deflateBufferSize-Direktive reduzieren (effektiver als das Deaktivieren) Pufferung insgesamt).

Wenn dies Apache ist, stellen Sie sicher, dass Sie Keepalives aktiviert haben.

Wenn zwischen Ihnen und dem Server weitere Proxies vorhanden sind, können Sie mit HTTP nicht viel tun, aber sie haben keinen Einfluss auf den HTTPS-Verkehr.

Schließlich, wenn Sie ein Anti-Virus-Produkt auf Ihrem Client verwenden, kann dies die Ursache für viele Probleme sein - viele unterbrechen die Netzwerkverbindung zwischen einem Browser und dem Netzwerk. IME lassen sie oft viel zu wünschen übrig in der Qualität, wie sie das machen.

Am Ende des Tages gibt es Grenzen, was Sie tun, wenn Sie die Infrastruktur nicht kontrollieren. Aber es gibt andere Lösungen als Chunked Encoding/Progressive Rendering.

+0

Wie ich im OP gesagt habe, ist es ein GoDaddy Shared Linux Hosting Account. Ich glaube, dass sie Apache 2.x verwenden, aber ich weiß es nicht sicher. Und es ist mir egal, dass die Skripte länger brauchen, solange sie sofort eine Ausgabe ausgeben, sobald sie verfügbar ist (was die Benutzerfreundlichkeit stark erhöht). Und wie ich im OP gesagt habe, lief dieses genaue Skript auf einem anderen Host gut, bevor es zu GoDaddy verschoben wurde, also hoffte ich, dass es eine Art von Einstellung ist, die ich vermisse. – user496854

+0

Überprüfen Sie Ihre Wasserfälle. – symcbean

+0

Ich bin nicht sicher, was die Wasserfälle mit irgendetwas zu tun haben würden. Wie ich bereits sagte, habe ich ein einfaches Skript erstellt, das nur 5 Mal eine Schleife ausführt und einen String pro Schleife ausgibt, und ich sehe keine Ausgabe, die gerendert wird, bis das ganze Skript beendet ist – user496854