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

PHP Zip 擴展完整指南:安裝配置與核心函數速查表

     編輯:PHP 相關知識

擴展簡介

PHP Zip 擴展提供讀取、建立、解壓縮 ZIP 檔案的完整功能。基於 libzip 库,支援加密、註解、多種壓縮算法。PHP 8.0+ 內建,舊版本需額外安裝。

安裝與啟用

Linux (PHP 7/8)

# Debian/Ubuntu
apt-get install php-zip
# 或編譯安裝
./configure --with-zip
make && make install

# 啟用
echo "extension=zip" > /etc/php/8.x/mods-available/zip.ini
phpenmod zip

Windows

; php.ini 中取消註解
extension=zip
; 確認 extension_dir 指向正確路徑
extension_dir = "C:/php/ext"

驗證安裝

php -m | grep zip
# 或
php -r "var_dump(extension_loaded('zip'));"

核心函數速查表

函數說明回傳值
zip_open(string $filename)打開 ZIP 檔案資源 handle / false
zip_read(resource $zip)讀取下一個條目資源 entry / false
zip_entry_open(resource $zip, resource $entry, string $mode = "r")打開條目準備讀取bool
zip_entry_read(resource $entry, int $length = 1024)讀取條目內容string / false
zip_entry_close(resource $entry)關閉條目void
zip_close(resource $zip)關閉 ZIP 檔案void
zip_entry_name(resource $entry)取得條目名稱string
zip_entry_filesize(resource $entry)取得原始檔案大小int
zip_entry_compressedsize(resource $entry)取得壓縮後大小int
zip_entry_compressionmethod(resource $entry)取得壓縮方法int

實戰範例

1. 列出 ZIP 內容

<?php
function listZip($zipPath) {
  $zip = zip_open($zipPath);
  if (!$zip) throw new Exception("無法打開: $zipPath");

  $files = [];
  while ($entry = zip_read($zip)) {
    $files[] = [
      'name' => zip_entry_name($entry),
      'size' => zip_entry_filesize($entry),
      'compressed' => zip_entry_compressedsize($entry),
      'method' => zip_entry_compressionmethod($entry)
    ];
  }
  zip_close($zip);
  return $files;
}

print_r(listZip('example.zip'));

2. 解壓縮到指定目錄

<?php
function extractZip($zipPath, $destDir) {
  $zip = zip_open($zipPath);
  if (!$zip) return false;

  while ($entry = zip_read($zip)) {
    $name = zip_entry_name($entry);
    $path = $destDir . DIRECTORY_SEPARATOR . $name;

    // 目錄處理
    if (substr($name, -1) === '/') {
      @mkdir($path, 0755, true);
      continue;
    }

    // 確保父目錄存在
    @mkdir(dirname($path), 0755, true);

    if (zip_entry_open($zip, $entry, 'r')) {
      $content = '';
      while ($buf = zip_entry_read($entry, 8192)) {
        $content .= $buf;
      }
      file_put_contents($path, $content);
      zip_entry_close($entry);
    }
  }
  zip_close($zip);
  return true;
}

extractZip('backup.zip', '/var/www/restore');

3. 建立 ZIP(需 ZipArchive 類,功能更強)

<?php
$zip = new ZipArchive();
if ($zip->open('archive.zip', ZipArchive::CREATE) === TRUE) {
  $zip->addFile('document.pdf', 'docs/document.pdf');
  $zip->addFromString('readme.txt', '這是說明文件');
  $zip->close();
  echo '建立成功';
} else {
  echo '建立失敗';
}

ZipArchive vs zip_* 函數

特性ZipArchive (OO)zip_* 函數 (程序式)
建立新檔✅ 完整支援❌ 不支援
加密/密碼✅ setEncryptionName()❌
註解操作✅ setArchiveComment()❌
刪除條目✅ deleteName()❌
記憶體效率較好(流式)需手動控制
PHP 版本5.2+4.1+(舊版相容)

建議:新專案優先使用 ZipArchive,功能更完整、物件導向、記憶體管理更好。

常見問題排查

  • 中文檔名亂碼:ZIP 標準早期不支援 UTF-8,需 ZipArchive::FL_ENC_UTF_8 或使用 iconv 轉碼
  • 大檔案記憶體耗盡:分塊讀寫,避免一次 file_get_contents 整個檔案
  • 權限問題:確保 PHP 進程對目標目錄有寫入權限
  • 執行超時:大檔案解壓設 set_time_limit(0)

效能優化建議

  1. 使用 ZipArchive 而非舊式函數
  2. 大量檔案考慮分批處理,避免單次腳本過久
  3. 生產環境啟用 Opcache,減少擴展載入開銷
  4. 壓縮等級權衡:ZipArchive::setCompressionIndex() 可指定 0-9 級
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved