es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

El archivo PHP ZipArchive se está bloqueando después de comprimir muchos archivos.

He creado un programa simple que coloca fotos en un archivo ZipArchive. Todo funciona hasta que intento comprimir más de un par de fotos (alrededor de 60). Después de eso, obtengo algo como esto en la pantalla:

https://i.stack.imgur.com/DtgHG.png

He cambiado el max_execution_time a 1200 y memory_limit a 256M en php.ini.

El servidor es Nginx 1.18 con PHP7.4 y Ubuntu 20.4. Todo funciona en Laravel 8.

¿Alguna idea?

Este es mi controlador ZipController:

public function downloadZip(Request $req)
{   

    $id = $req->input('id');

    $sessions = DB::table('sessions')->where('id', $id)->get();
    $photos = DB::table('sessions_files')->where('session_id', $id)->get();

    $zip = new ZipArchive;

    $path = 'images/sessions/'.$id;

    $fileName = 'Sesja-numer-'.$id.'.zip';

    if ($zip->open($fileName, ZipArchive::CREATE) === TRUE)
    {
        $numerek = 1;
        foreach ($photos as $photo) {
            echo $photo->file;
            $addFile = $path.'/'.$photo->file;
            $fileNewName = 'Zdjecie-'.$numerek.'.jpg';
            $zip->addFile($addFile, $fileNewName);
            $numerek++;
        }
        ob_end_clean();
        $zip->close();            
    }

    return response()->download($fileName)->deleteFileAfterSend();
    return redirect('/dashboard/sessions/'.$id);

}
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error en la captura de pantalla sugiere que el script PHP ha excedido el límite de memoria permitido. Dado que aumentar el valor de memory_limit en el archivo php.ini no resolvió el problema, debemos considerar otras posibles causas.

    Una posible causa es que el directorio temporal del servidor (generalmente /tmp/) no sea escribible o no tenga suficiente espacio. Dado que la clase ZipArchive utiliza el directorio temporal del sistema para crear archivos zip, debemos asegurarnos de que sea accesible y tenga suficiente espacio libre en disco.

    Otra posible causa es que el proceso PHP se esté quedando sin memoria debido a un uso ineficiente de la memoria en el script. Esto podría deberse a la carga de archivos de imágenes grandes en memoria de una sola vez, en lugar de procesarlos en lotes o flujos. Para optimizar el uso de memoria, podemos intentar utilizar el método ZipArchive::addFile con el parámetro $localname establecido en null, lo que permite enviar el contenido del archivo directamente al archivo zip sin cargarlo completamente en memoria de una sola vez.

    También podemos intentar utilizar el método ZipArchive::open con la bandera ZIPARCHIVE::CREATE, que crea un nuevo archivo incluso si ya existe uno con el mismo nombre. Esto puede evitar errores causados al agregar continuamente al mismo archivo.

    Finalmente, podemos monitorizar el uso de recursos del servidor durante la ejecución del script utilizando herramientas como top o htop, y buscar cualquier pico o cuello de botella en el uso de CPU, memoria o disco. Esto puede ayudar a identificar cualquier problema de rendimiento subyacente y sugerir más optimizaciones o cambios de configuración.

Comments are closed.