PHP Zip 擴展提供讀取、建立、解壓縮 ZIP 檔案的完整功能。基於 libzip 库,支援加密、註解、多種壓縮算法。PHP 8.0+ 內建,舊版本需額外安裝。
# 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
; 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 |
<?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'));
<?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');
<?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 (OO) | zip_* 函數 (程序式) |
|---|---|---|
| 建立新檔 | ✅ 完整支援 | ❌ 不支援 |
| 加密/密碼 | ✅ setEncryptionName() | ❌ |
| 註解操作 | ✅ setArchiveComment() | ❌ |
| 刪除條目 | ✅ deleteName() | ❌ |
| 記憶體效率 | 較好(流式) | 需手動控制 |
| PHP 版本 | 5.2+ | 4.1+(舊版相容) |
建議:新專案優先使用 ZipArchive,功能更完整、物件導向、記憶體管理更好。
ZipArchive::FL_ENC_UTF_8 或使用 iconv 轉碼file_get_contents 整個檔案set_time_limit(0)ZipArchive 而非舊式函數ZipArchive::setCompressionIndex() 可指定 0-9 級