Transmisión de archivos grandes con PHP Script

Usando un script similar que se encuentra en los comentarios de http://php.net/manual/en/function.fread.php, He ideado esta función:

function readfile_chunked_remote($filename, $seek = 0, $retbytes = true, $timeout = 3) {
    set_time_limit(0);
    $defaultchunksize = 1024*1024;
    $chunksize = $defaultchunksize;
    $buffer = '';
    $cnt = 0;
    $remotereadfile = false;

    if (preg_match('/[a-zA-Z]+:\/\//', $filename))
        $remotereadfile = true;

    $handle = @fopen($filename, 'rb');

    if ($handle === false) {
        return false;
    }

    header("Content-Type: application/octet-stream; ");
    header("Content-Transfer-Encoding: binary");
    header("Cache-Control: no-cache, must-revalidate");
    header("Content-Length: " . filesize($filename));
    header("Content-Disposition: attachment; filename=\"" . basename($filename) . "\"");

    stream_set_timeout($handle, $timeout);

    if ($seek != 0 && !$remotereadfile)
        fseek($handle, $seek);

    while (!feof($handle)) {

        if ($remotereadfile && $seek != 0 && $cnt+$chunksize > $seek)
            $chunksize = $seek-$cnt;
        else
            $chunksize = $defaultchunksize;

        $buffer = @fread($handle, $chunksize);

        if ($retbytes || ($remotereadfile && $seek != 0)) {
            $cnt += strlen($buffer);
        }

        if (!$remotereadfile || ($remotereadfile && $cnt > $seek))
            echo $buffer;

        ob_flush();
        flush();
    }

    $info = stream_get_meta_data($handle);

    $status = fclose($handle);

    if ($info['timed_out'])
        return false;

    if ($retbytes && $status) {
        return $cnt;
    }

    return $status;
}

Sin embargo, parece que todavía se agota el tiempo de espera para archivos de más de 100 MB más o menos ... ¿dónde podría estar yendo mal?

preguntado el 27 de agosto de 11 a las 21:08

has probado con readfile() ? -

Tenía la impresión de que readfile () cargaba el archivo completo en la memoria. -

no, transmite el archivo al cliente -

Una prueba rápida muestra que readfile () sí carga el archivo completo en la memoria, pero transmite el archivo al cliente como cabría esperar. -

Una mirada en las fuentes muestra que no :) bit.ly/pjcpYp -> bit.ly/nkbSge -

2 Respuestas

Prueba xmoovstream. Lo hará por ti. Open Source también.

Respondido el 02 de Septiembre de 11 a las 13:09

Según el manual, utilice readfile()

Nota: readfile () no presentará ningún problema de memoria, incluso al enviar archivos grandes, por sí solo. Si encuentra un error de memoria insuficiente, asegúrese de que el búfer de salida esté desactivado con ob_get_level ().

http://php.net/readfile

Respondido 12 Feb 13, 14:02

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.