Buffer de salida para archivos pesados PHP (descarga navegador)

Muchas veces usamos la función file_get_contents() de PHP, esta función obtiene el contenido de un fichero a partir de pasarle el nombre como parámetro.

Esta función se queda “corta” cuando se trabaja con archivos con un gran tamaño ya que lo más seguro es que la configuración de PHP tenga una memoria limitada.

Si usamos más memoria de la que tenemos permitida nos saldrá un error similar a:

PHP E_ERROR: Allowed memory size of 402653184 bytes exhausted (tried to allocate 115707904 bytes)

Una solución es subir la memoria de PHP:

ini_set('memory_limit', '256M');

Pero si no tenemos o no queremos usar esta opción, podemos abrir el fichero usando fopen() e ir volcando poco a poco el contenido del fichero sobre la descarga del navegador usando un buffer de salida, para esto usaremos la función fgets(), por lo tanto si se quiere descargar un fichero grande el navegador poco a poco irá volcando su contenido.

ob_start();
header('Content-type: application/zip');
header('Content-Disposition: attachment; filename="Nombre_del_archivo"');
 
$rutaArchivo='ruta/nombre.zip';
$gestor = fopen($rutaArchivo, "r");
if ($gestor)
{
   while (($bufferSalida = fgets($gestor, 4096)) !== false)
   {
      echo $bufferSalida;
      ob_flush(); //vaciamos el el buffer de salida
      flush(); //Vaciamos el buffer de salida del sistema
      set_time_limit(10); //ampliamos el límite de tiempo máximo de ejecución
   }
   if (!feof($gestor))
   {
      echo "Error: fallo inesperado de fgets()";
   }
   fclose($gestor);
}
ob_end_flush();

Iván Martínez

Ingeniero Informático apasionado por el mundo del desarrollo WEB. Me gusta caminar por este mundo lleno de tecnologías y día a día aprender cosas nuevas como el doctor Frankenstein ¡dadme cosas para experimentar!

Deja un comentario

Tu dirección de correo electrónico no será publicada.