Если ваш веб-сервер работает под управлением linux, вы МОЖЕТЕ сделать это в потоковом режиме без создания временного файла.Под win32 вам может понадобиться использовать Cygwin или что-то подобное.
Если вы используете «-» в качестве имени файла zip, оно будет сжато в стандартный вывод.Оттуда достаточно просто перенаправить этот поток с помощью popen ().Аргумент "-q" просто говорит zip не выводить текст состояния, как обычно.Для получения дополнительной информации см. Справочную страницу zip (1).
<?
$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 );
}
?>