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

PHP PclZip 壓縮解壓縮庫完整使用教學

     編輯:PHP 相關知識

PclZip 是純 PHP 實現的 ZIP 壓縮/解壓縮庫,無需額外擴展即可運行,功能強大且 API 直觀。本文詳細說明建立壓縮檔、列出內容、解壓縮、路徑處理等核心操作,並解析其靈活的選項參數設計。

基本建立壓縮檔

<?php
include_once 'pclzip.lib.php';

$archive = new PclZip('archive.zip');

// 方式一:直接壓縮檔案/目錄(保留相對路徑)
$v_list = $archive->create('file.txt, data/text.txt, folder');
if ($v_list == 0) {
    die('Error: ' . $archive->errorInfo(true));
}

// 方式二:進階路徑控制
$v_list = $archive->create(
    'data/file.txt, data/text.txt',          // 來源檔案
    PCLZIP_OPT_REMOVE_PATH, 'data',          // 移除來源路徑前綴 'data/'
    PCLZIP_OPT_ADD_PATH, 'install'           // 加上新前綴 'install/'
);
if ($v_list == 0) {
    die('Error: ' . $archive->errorInfo(true));
}
?>

核心選項參數詳解

PclZip 採用 常數 + 值成對出現 的可變參數設計,極具彈性:

常數用途說明
PCLZIP_OPT_REMOVE_PATH移除路徑前綴字串或陣列,從來源路徑移除指定前綴
PCLZIP_OPT_ADD_PATH添加路徑前綴壓縮包內檔案將置於此虛擬目錄下
PCLZIP_OPT_PATH設定解壓縮目標目錄配合 extract() 使用
PCLZIP_OPT_EXTRACT_AS_STRING解壓至字串變數不寫入磁碟,直接返回內容
PCLZIP_OPT_BY_NAME按檔名篩選僅處理指定檔名
PCLZIP_OPT_BY_EREG正則篩選僅處理符合正則的檔案
PCLZIP_OPT_REPLACE_NEWER僅替較新檔案解壓時保留較新版本
PCLZIP_OPT_STOP_ON_ERROR錯誤即停止預設繼續處理
PCLZIP_OPT_TEMP_DIR指定臨時目錄大檔案處理時避免預設目錄空間不足
PCLZIP_OPT_COMMENT設定壓縮包註解字串
PCLZIP_OPT_PREPEND_COMMENT前綴註解追加至現有註解

常見操作範例

列出壓縮包內容

$list = $archive->listContent();
if ($list == 0) die('Error: ' . $archive->errorInfo(true));
foreach ($list as $file) {
    echo "{$file['filename']} | {$file['stored_filename']} | "
       . "大小: {$file['size']} | 壓縮後: {$file['compressed_size']} | "
       . "時間: " . date('Y-m-d H:i:s', $file['mtime']) . "
"; }

解壓縮至指定目錄

$list = $archive->extract(
    PCLZIP_OPT_PATH, 'extract_folder/',
    PCLZIP_OPT_REPLACE_NEWER
);
if ($list == 0) die('Error: ' . $archive->errorInfo(true));

解壓單一檔案至變數

$content = $archive->extract(
    PCLZIP_OPT_BY_NAME, 'config.php',
    PCLZIP_OPT_EXTRACT_AS_STRING
);
if ($content == 0) die('Error: ' . $archive->errorInfo(true));
echo $content[0]['content']; // 直接取得檔案內容

刪除壓縮包內檔案

$list = $archive->delete(PCLZIP_OPT_BY_NAME, 'old.txt');

獲取壓縮包屬性

$props = $archive->properties();
echo "檔案數: {$props['nb']} | 總大小: {$props['size']} | 註解: {$props['comment']}";

錯誤處理模式

if ($result == 0) {
    // 詳細錯誤資訊
    $error = $archive->errorInfo(true); // true = 返回陣列, false = 返回字串
    echo "代碼: {$error['code']} | 訊息: {$error['message']}";
}

效能與限制考量

  • 純 PHP 實現:大檔案 (超過 100MB) 壓縮/解壓速度較 C 擴展 (ZipArchive) 慢,記憶體佔用高。
  • 記憶體限制:處理大量檔案可能觸發 memory_limit,需分批或調整配置。
  • ZIP64 支援:舊版本不支援 4GB 以上壓縮包,新版已改善。
  • 加密支援:僅支援傳統 ZipCrypto,不支援 AES-256。需加密請改用 ZipArchive + setPassword() (PHP 7.2+)。

現代替代方案對比

庫/擴展類型優點缺點
ZipArchiveC 擴展速度快、支援 ZIP64/AES、原生串流需安裝擴展、API 較底層
PclZip純 PHP零依賴、共享主機友善、API 高階大檔案效能弱、無 AES
nelexa/zip純 PHP (現代)支援 ZIP64/AES、PSR 標準、串流相對較新、社區較小
chumper/zipperLaravel 封裝語法優雅、整合框架依賴 ZipArchive

結語

PclZip 以零依賴、高階 API 成為共享主機、舊專案、快速原型的首選 ZIP 工具。理解其選項參數設計(常數+值成對),可靈活處理路徑重寫、篩選、串流等進階需求。新專案若環境允許,優先考慮 ZipArchive 或現代純 PHP 庫以獲得更好效能與安全性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved