Utilizando PHP, estoy tratando de servir archivos de gran tamaño (hasta posiblemente 200 MB) que no están en un directorio accesible a través de la web debido a problemas de autorización. Actualmente, utilizo una llamada readfile()
junto con algunos encabezados para servir el archivo, pero parece que PHP lo está cargando en la memoria antes de enviarlo. Tengo la intención de implementar en un servidor de alojamiento compartido, lo que no me permitirá usar mucha memoria o agregar mis propios módulos de Apache como X-Sendfile.Cómo descargar archivos de gran tamaño a través de la secuencia de comandos PHP
No puedo permitir que mis archivos estén en un directorio accesible por razones de seguridad. ¿Alguien sabe un método que consume menos memoria y que puedo implementar en un servidor de alojamiento compartido?
EDIT:
if(/* My authorization here */) {
$path = "/uploads/";
$name = $row[0]; //This is a MySQL reference with the filename
$fullname = $path . $name; //Create filename
$fd = fopen($fullname, "rb");
if ($fd) {
$fsize = filesize($fullname);
$path_parts = pathinfo($fullname);
$ext = strtolower($path_parts["extension"]);
switch ($ext) {
case "pdf":
header("Content-type: application/pdf");
break;
case "zip":
header("Content-type: application/zip");
break;
default:
header("Content-type: application/octet-stream");
break;
}
header("Content-Disposition: attachment; filename=\"".$path_parts["basename"]."\"");
header("Content-length: $fsize");
header("Cache-control: private"); //use this to open files directly
while(!feof($fd)) {
$buffer = fread($fd, 1*(1024*1024));
echo $buffer;
ob_flush();
flush(); //These two flush commands seem to have helped with performance
}
}
else {
echo "Error opening file";
}
fclose($fd);
No estoy de acuerdo con esto es un duplicado, este tipo está tratando de descargar a través de PHP, donde-como la otra pregunta es cómo descargar un archivo grande ... diferentes problemas con sinceridad. –