Мне нужно решение, которое работало бы на веб-сайтах Azure (IIS) и имело проблемы с созданием новых файлов на сервере с использованием методов из других ответов. Решение, которое работало для меня, состояло в том, чтобы использовать небольшую библиотеку TbsZip для сжатия, которая не требует записи файла в любом месте сервера - она просто возвращается напрямую через HTTP.
Эта ветка старая, но такой подход может быть немного более общим и полным, поэтому я выкладываю код в качестве альтернативы:
// Compress all files in current directory and return via HTTP as a ZIP file
// by buli, 2013 (http://buli.waw.pl)
// requires TbsZip library from http://www.tinybutstrong.com
include_once('tbszip.php'); // load the TbsZip library
$zip = new clsTbsZip(); // instantiate the class
$zip->CreateNew(); // create a virtual new zip archive
// iterate through files, skipping directories
$objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator('.'));
foreach($objects as $name => $object)
{
$n = str_replace("/", "\\", substr($name, 2)); // path format
$zip->FileAdd($n, $n, TBSZIP_FILE); // add fileto zip archive
}
$archiveName = "backup_".date('m-d-Y H:i:s').".zip"; // name of the returned file
$zip->Flush(TBSZIP_DOWNLOAD, $archiveName); // flush the result as an HTTP download
А вот и вся статья в моем блоге .