在 PHP 專案中處理 ZIP 檔案是常見需求:備份部署、匯出報表、插件安裝等。PclZip 作為純 PHP 實現的 ZIP 處理庫,無需擴充模組即可運行,支援建立、讀取、解壓、增刪檔案、權限控制、註解管理等豐富功能,且 API 設計極具「PHP 風格」——參數以「常數 + 值」成對傳遞,靈活強大。本文將系統介紹其核心用法與實戰技巧。
官網:https://www.phpconcept.net/pclzip/
下載 pclzip.lib.php 放入專案,直接 include_once 即可使用。
<?php
include_once('pclzip.lib.php');
$archive = new PclZip('backup.zip');
// 簡單模式:直接打包檔案/目錄
$v_list = $archive->create('file.txt,data/text.txt,folder');
if ($v_list == 0) die("Error: " . $archive->errorInfo(true));
// 進階模式:路徑重映射
// 將 data/file.txt、data/text.txt 打包為 install/file.txt、install/text.txt
$v_list = $archive->create(
'data/file.txt,data/text.txt',
PCLZIP_OPT_REMOVE_PATH, 'data', // 移除前綴 'data'
PCLZIP_OPT_ADD_PATH, 'install' // 加上前綴 'install'
);
?>
<?php
require_once('pclzip.lib.php');
$zip = new PclZip("full_backup.zip");
$v_list = $zip->create(
$_SERVER['DOCUMENT_ROOT'],
PCLZIP_OPT_REMOVE_PATH, $_SERVER['DOCUMENT_ROOT']
);
if ($v_list == 0) {
echo '異常:' . $zip->errorInfo(true);
} else {
echo '備份成功,共 ' . count($v_list) . ' 個檔案';
}
?>
| 操作 | 方法與關鍵選項 | 說明 |
|---|---|---|
| 解壓縮 | extract(PCLZIP_OPT_PATH, 'target_dir') |
指定解壓目標目錄 |
| 添加檔案 | add('file.txt', PCLZIP_OPT_ADD_PATH, 'prefix') |
向現有 ZIP 追加檔案,可重映射路徑 |
| 移除路徑前綴 | PCLZIP_OPT_REMOVE_PATH, '/base/path' |
打包時去除指定前綴 |
| 移除所有路徑 | PCLZIP_OPT_REMOVE_ALL_PATH |
壓縮包內僅保留檔案名,無目錄結構 |
| 設定解壓權限 | extract(PCLZIP_OPT_SET_CHMOD, 0777) |
解壓後檔案權限 |
| 按名稱解壓 | extract(PCLZIP_OPT_BY_NAME, 'a.txt,b.txt') |
支援陣列或逗號分隔字串 |
| 正則匹配解壓 | extract(PCLZIP_OPT_BY_EREG, 'pattern') / PCLZIP_OPT_BY_PREG |
EREG / PCRE 正則過濾 |
| 索引範圍解壓 | extract(PCLZIP_OPT_BY_INDEX, ['0-1','6-7']) |
按檔案在壓縮包內順序篩選 |
| 輸出字串而非檔案 | extract(PCLZIP_OPT_BY_NAME, 'readme.txt', PCLZIP_OPT_EXTRACT_AS_STRING) |
直接取得檔案內容字串 |
| 直接輸出到瀏覽器 | extract(PCLZIP_OPT_BY_NAME, 'readme.txt', PCLZIP_OPT_EXTRACT_IN_OUTPUT) |
適合下載單一檔案 |
| 不壓縮直接存入 | add('file.txt', PCLZIP_OPT_NO_COMPRESSION) |
僅封裝,不壓縮 |
| 管理註解 | PCLZIP_OPT_COMMENT / ADD_COMMENT / PREPEND_COMMENT |
覆蓋/追加/前置 註解 |
PclZip 的 create()、add()、extract() 等方法採用 可變長度「選項-值」對 設計:
$archive->create($filelist, OPTION1, VALUE1, OPTION2, VALUE2, ...);
這在 PHP 早期極具創新性,實現了類似「命名參數」的效果,讓單一方法支援數十種組合而不需重載。雖然現代 PHP 推薦用陣列或物件傳參,但這種設計在無嚴格類型、無命名參數的年代極大降低了 API 記憶負擔。
memory_limit 或分塊處理/,避免 \ 導致路徑匹配失敗ZipArchive(C 擴充模組)或系統 zip 指令errorInfo(true) 取得詳細錯誤| 方案 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| PclZip | 純 PHP、零依賴、功能全 | 大檔案慢、記憶體佔用高 | 中小專案、共享主機無法安裝擴充模組 |
| ZipArchive | C 層實現、速度快、記憶體效率高 | 需安裝 php-zip 擴充模組 | 生產環境、大檔案、高併發 |
| system('zip ...') | 效能最強、支援分卷、加密 | 依賴系統指令、安全風險、跨平台差異 | 超大備份、CI/CD 流程 |
PclZip 以「純 PHP、零配置、API 靈活」三大優勢,成為無法安裝擴充模組環境下的首選 ZIP 處理庫。掌握其「選項-值」參數模式與路徑重映射技巧,能輕鬆應對 90% 的壓縮解壓業務場景。對於現代高併發、大檔案專案,建議遷移至 ZipArchive 以獲得更優效能與穩定性。