2009-03-06 15 views
10

lo tanto, estoy buscando algo más eficiente que esto:salida de volcado en un archivo y el navegador

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

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

echo $content; 
?> 

Los problemas con los anteriores:

  • cliente no recibe nada hasta toda la página se rindió
  • del archivo podría ser enorme, así que es mejor no tener todo esto en memoria

Alguna sugerencia?

+0

quieres decir que test.php (o el resultado de la evaluación del mismo) puede ser enorme? –

+0

El resultado de evaluarlo podría ser enorme. –

Respuesta

6

Problema interesante; no creo que intenté resolver esto antes.

Estoy pensando que necesitarás tener una segunda solicitud desde tu script PHP frontal a tu servidor. Esta podría ser una simple llamada al http://localhost/test.php. Si usa fopen-wrappers, podría usar fread() para extraer la salida de test.php a medida que se procesa, y luego de recibir cada fragmento, enviarlo a la pantalla y anexarlo a su archivo test.html.

Así es como debería parecerse (no probado!): Respuesta

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

Interesante. Agregando este a mi toolbelt. –

0

de Pix0r es lo que quiere a menos que realmente lo necesita "incluido" en lugar de simplemente ejecuta. Por ejemplo, si tiene información de inicio de sesión antes de test.php, no pasará al archivo si lo llama con fopen.

Si lo necesita genuinamente incluido, entonces lo que tiene es el método más simple, pero si quiere un resultado constante, tendrá que escribir test.php de manera que produzca y almacene la información tal como está va. Por lo que yo sé, no hay forma de que recopilen el búfer y lo generen a medida que avanzan.

-1

Aquí va x-send-file, use mod_xsendfile para enviar archivos de manera eficiente, realmente fácil.

+1

Lo investigaré, pero no aborda mi problema exactamente. Quiero generar y transmitir archivos de gran tamaño desde PHP sin tener que generar primero el archivo estático. Me gustaría hacerlos en paralelo. –

2

Una mejor forma de hacerlo es utilizar los primeros dos parámetros aceptados por ob_start: output_callback y chunk_size. El primero especifica una devolución de llamada para manejar la salida, ya que está almacenada en búfer, y la última especifica el tamaño de los fragmentos de salida que se deben manejar.

Aquí está un ejemplo:

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

En este ejemplo, se vaciará el búfer de salida (enviado) por cada 4096 bytes de salida (y una vez más al final de la llamada ob_end_flush). Cada vez que se vacía el búfer, se llamará a la devolución de llamada $write_ob_to_file y se pasará el último fragmento. Esto se escribe en test.html. La devolución de llamada luego devuelve false, lo que significa "generar este fragmento como está". Si solo desea escribir el resultado en un archivo y no en la secuencia de salida de PHP, puede devolver una cadena vacía en su lugar.

Cuestiones relacionadas