首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 產生 ZIP 壓縮檔並提供下載完整實作

     編輯:PHP 相關知識

使用 ZipArchive 類別建立壓縮檔的現代做法

早期 PHP 常需引入第三方類別(如舊文中的 PHPZip)產生 ZIP。自 PHP 5.2 起,內建 ZipArchive 類別功能完整、效能優異,已成標準選擇。

基本建立與下載流程

<?php
function createAndDownloadZip(string $sourceDir, string $zipName): void
{
    if (!is_dir($sourceDir)) {
        throw new InvalidArgumentException("來源目錄不存在: $sourceDir");
    }

    $zip = new ZipArchive();
    $tempFile = sys_get_temp_dir() . '/' . $zipName;

    if ($zip->open($tempFile, ZipArchive::CREATE | ZipArchive::OVERWRITE) !== true) {
        throw new RuntimeException("無法建立暫存 ZIP 檔案");
    }

    $files = new RecursiveIteratorIterator(
        new RecursiveDirectoryIterator($sourceDir, FilesystemIterator::SKIP_DOTS),
        RecursiveIteratorIterator::LEAVES_ONLY
    );

    foreach ($files as $file) {
        $relativePath = substr($file->getPathname(), strlen($sourceDir) + 1);
        if ($file->isDir()) {
            $zip->addEmptyDir($relativePath);
        } else {
            $zip->addFile($file->getPathname(), $relativePath);
        }
    }

    $zip->close();

    // 輸出下載
    header('Content-Type: application/zip');
    header('Content-Disposition: attachment; filename="' . $zipName . '"');
    header('Content-Length: ' . filesize($tempFile));
    readfile($tempFile);
    unlink($tempFile); // 清理暫存檔
    exit;
}

// 使用範例
createAndDownloadZip('/var/www/uploads/user_123', 'backup_' . date('Ymd') . '.zip');
?>

進階功能:加密、註解、壓縮等級

<?php
$zip = new ZipArchive();
$zip->open('secure.zip', ZipArchive::CREATE);

// 設定密碼(PHP 7.2+,需 libzip 1.2+)
$zip->setPassword('strong_password');
$zip->setEncryptionName('secret.txt', ZipArchive::EM_AES_256);

$zip->addFromString('secret.txt', '機密內容');
$zip->setArchiveComment('加密備份 ' . date('Y-m-d H:i:s'));
$zip->close();
?>

大量檔案記憶體優化建議

  • 避免一次 addFile 過大檔案導致記憶體飆升;ZipArchive 以串流方式寫入,通常不佔用大量記憶體。
  • 若需打包超大目錄(>2GB),注意 ZIP 格式 4GB 限制,考慮改用 ZipArchive::CREATE 搭配 ZipArchive::OVERWRITE 分卷或改用 tar.gz。
  • 生產環境建議將壓縮任務放入隊列(如 Laravel Queue、Gearman)非同步處理,避免阻塞 HTTP 請求。

常見錯誤排查

錯誤原因解決
Class 'ZipArchive' not found未安裝 php-zip 擴充apt-get install php-zip 或 yum install php-pecl-zip
Permission denied目錄權限不足確認 PHP 執行身份對來源目錄有讀取權限
Maximum execution time exceeded壓縮耗時過長調大 set_time_limit(0) 或改非同步處理
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved