2009-03-06 20 views
10

Więc szukam czegoś bardziej efektywny niż to:żywo wyjście do pliku i przeglądarki

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

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

echo $content; 
?> 

Problemy z powyższym:

  • klient nie otrzymuje nic, dopóki cała strona jest renderowane
  • Plik może być ogromna, więc wolałbym nie mieć całość w pamięci

Jakieś sugestie?

+0

masz na myśli test.php (lub wynik jej oceny) może być ogromny? –

+0

Wynik oceny może być ogromny. –

Odpowiedz

6

Interesujący problem; nie sądzę, że wcześniej próbowałem to rozwiązać.

Wydaje mi się, że będziesz potrzebować drugiej aplikacji z twojego skryptu PHP z przodu na serwer. Może to być proste połączenie z http://localhost/test.php. Jeśli używasz fopen-wrapperów, możesz użyć fread(), aby wyciągnąć wyjście z pliku test.php w trakcie renderowania, a po otrzymaniu każdego fragmentu wyprowadź go na ekran i dołącz do pliku test.html.

Oto jak to może wyglądać (przetestowane!): Odpowiedź

<?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

Interesujące. Dodanie tego do mojego paska narzędzi. –

0

Pix0r jest to, co chcesz, chyba rzeczywiście trzeba to „włączone”, a nie tylko wykonywany. Na przykład, jeśli masz dane logowania przed test.php, nie zostanie ono przekazane do pliku, jeśli wywołasz go z fopen.

Jeśli naprawdę tego potrzebujesz, to masz najprostszą metodę, ale jeśli chcesz mieć stały wynik, będziesz musiał napisać test.php w taki sposób, aby wyświetlał i zapisywał informacje w ten sposób idzie. O ile wiem, nie ma sposobu na zbieranie bufora i wyprowadzanie go w trakcie pracy.

-1

Tutaj możesz x-send-file, użyj mod_xsendfile, aby wysłać plik sprawnie, naprawdę proste.

+1

Zajmę się tym, ale to nie rozwiązuje dokładnie mojego problemu. Chcę generować i przesyłać duże pliki z PHP bez konieczności wcześniejszego generowania pliku statycznego. Chciałbym zrobić to równolegle. –

2

Lepszym sposobem na to jest użycie dwóch pierwszych parametrów zaakceptowanych przez ob_start: output_callback i chunk_size. Pierwsza określa wywołanie zwrotne, aby obsłużyć dane wyjściowe jako buforowane, a drugie określa rozmiar porcji danych wyjściowych do obsługi.

Oto przykład:

$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); 

W tym przykładzie, bufor zostanie oczyszczony (wysłane) na każde 4096 bajtów wyjścia (i raz na końcu przez wywołanie ob_end_flush). Za każdym razem, gdy bufor zostanie przepłukany, wywołanie zwrotne $write_ob_to_file zostanie wywołane i przekazane jako ostatni fragment. Zostanie to zapisane w pliku test.html. Callback następnie zwraca false, co oznacza "wypisz ten fragment jak jest". Jeśli chcesz zapisać wynik tylko do pliku, a nie do strumienia wyjściowego PHP, możesz zamiast tego zwrócić pusty ciąg.

Powiązane problemy