Nếu máy chủ web của bạn đang chạy Linux, thì bạn có thể làm điều đó trực tuyến mà không có một tập tin tạm thời được tạo ra. Dưới win32 bạn có thể cần phải sử dụng Cygwin hoặc một cái gì đó tương tự.
Nếu bạn sử dụng "-" làm tên tệp zip, tệp sẽ nén thành giá trị chuẩn. Từ đó, bạn có thể dễ dàng chuyển hướng luồng đó bằng popen(). Đối số "-q" chỉ yêu cầu mã zip không xuất ra văn bản trạng thái bình thường. Xem manpage zip (1) để biết thêm thông tin.
<?
$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);
}
?>
Câu trả lời cho câu hỏi này là ở đây: http://stackoverflow.com/a/4357904/416630 – Lee