Si el servidor Web se está ejecutando Linux, entonces usted puede hacerlo sin la transmisión de un archivo temporal que se genera. En win32 puede que necesite usar Cygwin o algo similar.
Si usa "-" como el nombre del archivo zip, se comprimirá a stdout. A partir de ahí, es bastante fácil redirigir esa secuencia usando popen(). El argumento "-q" simplemente le dice a zip que no muestre el texto de estado que normalmente tendría. Consulte la página de manual de zip (1) para obtener más información.
<?
$zipfilename = "zip_file_name.zip";
if(isset($files)) unset($files);
$target = "/some/directory/of/files/you/want/to/zip";
$d = dir($target);
while(false !== ($entry = $d->read()))
{
if(substr($entry, 0, 1) != "." && !is_dir($entry))
{
$files[] = $entry;
}
}
header("Content-Type: application/x-zip");
header("Content-Disposition: attachment; filename=\"$zipfilename\"");
$filespec = "";
foreach($files as $entry)
{
$filespec .= "\"$entry\" ";
}
chdir($target);
$stream = popen("/usr/bin/zip -q - $filespec", "r");
if($stream)
{
fpassthru($stream);
fclose($stream);
}
?>
La respuesta a esta pregunta es aquí: http://stackoverflow.com/a/4357904/416630 – Lee