De manera nativa PHP tiene una clase para comprimir archivos (ZipArchive). Esto es muy útil cuando queremos empaquetar unos cuantos archivos, porque cada archivo se va adjuntando de forma individual; lo interesante viene cuando tenemos que empaquetar toda una carpeta que a su vez puede tener mas carpetas dentro.
Para hacer esto tenemos que usar un par de funciones que nos permitirán hacer recursividad. Veamos como.
//Creamos el archivo
$zip = new \ZipArchive();
//abrimos el archivo y lo preparamos para agregarle archivos
$zip->open("nombreArchivo.zip", \ZipArchive::CREATE | \ZipArchive::OVERWRITE);
//indicamos cual es la carpeta que se quiere comprimir
$origen = realpath('public/files');
//Ahora usando funciones de recursividad vamos a explorar todo el directorio y a enlistar todos los archivos contenidos en la carpeta
$files = new \RecursiveIteratorIterator(
new \RecursiveDirectoryIterator($origen),
\RecursiveIteratorIterator::LEAVES_ONLY
);
//Ahora recorremos el arreglo con los nombres los archivos y carpetas y se adjuntan en el zip
foreach ($files as $name => $file)
{
if (!$file->isDir())
{
$filePath = $file->getRealPath();
$relativePath = substr($filePath, strlen($origen) + 1);
$zip->addFile($filePath, $relativePath);
}
}
//Se cierra el Zip
$zip->close();
Con el código anterior ya podemos comprimir muchos archivos a la vez.