2009-03-06 3 views
10

Also, ich bin auf der Suche nach etwas effizienter als dies:Streaming Ausgabe in eine Datei und dem Browser

<?php 
ob_start(); 
include 'test.php'; 
$content = ob_get_contents(); 

file_put_contents('test.html', $content); 

echo $content; 
?> 

Die Probleme mit dem oben:

  • Kunde nichts empfängt, bis die gesamte Seite wird
  • Datei möglicherweise enorme gemacht, so würde ich lieber nicht die ganze Sache in Erinnerung

Irgendwelche Vorschläge?

+0

Sie meinen test.php (oder das Ergebnis der Bewertung davon) kann riesig sein? –

+0

Ergebnis der Auswertung könnte sehr groß sein. –

Antwort

6

Interessantes Problem; glaube nicht, dass ich versucht habe, das vorher zu lösen.

Ich denke, Sie müssen eine zweite Anfrage von Ihrem nach vorne gerichteten PHP-Skript auf Ihren Server gehen. Dies könnte ein einfacher Anruf an http://localhost/test.php sein. Wenn Sie fopen-wrappers verwenden, können Sie fread() verwenden, um die Ausgabe von test.php so zu ziehen, wie sie gerendert wird, und nach dem Empfang jedes Chunks diesen auf dem Bildschirm auszugeben und an Ihre test.html-Datei anzuhängen.

Hier ist, wie das aussehen könnte (ungetestet!):

<?php 
$remote_fp = fopen("http://localhost/test.php", "r"); 
$local_fp = fopen("test.html", "w"); 
while ($buf = fread($remote_fp, 1024)) { 
    echo $buf; 
    fwrite($local_fp, $buf); 
} 
fclose($remote_fp); 
fclose($local_fp); 
?> 
+0

Interessant. Hinzufügen dieses zu meinem Toolbelt. –

0

pix0r Antwort ist, was Sie wollen, wenn Sie tatsächlich brauchen sie „enthalten“ und nicht nur ausgeführt. Wenn Sie beispielsweise Anmeldeinformationen vor der test.php haben, werden sie nicht in die Datei übernommen, wenn Sie sie mit fopen aufrufen.

Wenn Sie es wirklich enthalten brauchen, dann ist das, was Sie haben, die einfachste Methode, aber wenn Sie konstante Ausgabe wollen, müssen Sie test.php tatsächlich in einer Weise schreiben, die die Informationen als auch speichert und speichert geht. Soweit ich weiß, gibt es keine Möglichkeit, sowohl Puffer zu sammeln als auch auszugeben.

-1

Hier gehen Sie x-send-file, verwenden Sie mod_xsendfile, um Datei effizient zu senden, wirklich einfach.

+1

Ich werde mich darum kümmern, aber es geht nicht genau auf mein Problem ein. Ich möchte große Dateien aus PHP erzeugen und streamen, ohne zuerst die statische Datei erzeugen zu müssen. Ich würde sie gerne parallel machen. –

2

Eine bessere Methode ist die Verwendung der ersten beiden Parameter, die von ob_start: output_callback und chunk_size akzeptiert werden. Ersteres gibt einen Callback für die Ausgabe an, während sie gepuffert ist, und letzteres gibt die Größe der zu behandelnden Ausgabe an.

Hier ein Beispiel:

$output_file = fopen('test.html', 'w'); 
if ($output_file === false) { 
    // Handle error 
} 

$write_ob_to_file = function($buffer) use ($output_file) { 
    fwrite($output_file, $buffer); 

    // Output string as-is 
    return false; 
}; 

ob_start($write_ob_to_file, 4096); 
include 'test.php'; 
ob_end_flush(); 

fclose($output_file); 

In diesem Beispiel wird der Ausgangspuffer (gesendet) für jeweils 4096 Bytes Ausgang (und noch einmal am Ende der ob_end_flush call) gespült werden. Bei jedem Löschen des Puffers wird der Callback $write_ob_to_file aufgerufen und der letzte Chunk übergeben. Dies wird in test.html geschrieben. Der Callback gibt dann false zurück und bedeutet "Ausgabe dieses Chunks wie er ist". Wenn Sie die Ausgabe nur in eine Datei und nicht in den Ausgabestrom von PHP schreiben möchten, können Sie stattdessen eine leere Zeichenfolge zurückgeben.