Fatal error: Class 'ZipArchive' not found 表示 **PHP 未加載 zip 擴展**。ZipArchive 非核心內置,需額外編譯/安裝 php_zip (Windows) 或 zip.so (Linux)。
php -m | grep -i zip # Linux/Mac
php -r "phpinfo();" | grep zip # 通用
# 輸出有 zip 則已加載,無則需安裝
php.ini (用 php --ini 確認路徑);extension=zip 或 ;extension=php_zip.dllextension=zipnet stop w3svc && net start w3svc (IIS) 或重啟 Apache/Nginx + PHP-FPMPHP 7.2+ 將擴展名統一為
zip(無 php_ 前綴),舊教程寫php_zip.dll可能不生效。
php_zip.dll 到 ext 目錄# PHP 8.2 示例
sudo apt update
sudo apt install php8.2-zip # 自動啟用並重載 php-fpm
# 或通用
sudo apt install php-zip # 安裝默認版本
# 驗證
php -m | grep zip
# 啟用 Remi 源 (獲取新版 PHP)
sudo dnf install https://rpms.remirepo.net/enterprise/remi-release-9.rpm
sudo dnf module enable php:remi-8.2
sudo dnf install php-zip php-pecl-zip # 兩個包名嘗試
# 重載
sudo systemctl restart php-fpm
# Dockerfile
RUN apk add --no-cache libzip-dev \
&& docker-php-ext-install zip
# 或 PECL
RUN apk add --no-cache libzip-dev \
&& pecl install zip \
&& docker-php-ext-enable zip
# 1. 安裝依賴
# Ubuntu: apt install libzip-dev
# CentOS: yum install libzip-devel
# 2. 下載對應 PHP 版本源碼包中的 ext/zip 目錄,或 PECL
cd /usr/src
wget https://pecl.php.net/get/zip-1.22.1.tgz # 版本匹配 PHP
tar xzf zip-1.22.1.tgz
cd zip-1.22.1
# 3. phpize 編譯
/usr/local/php/bin/phpize # 指定 phpize 路徑
./configure --with-php-config=/usr/local/php/bin/php-config --with-libzip
make -j$(nproc)
sudo make install
# 4. 啟用
echo "extension=zip.so" > /usr/local/php/etc/conf.d/zip.ini
# 或編輯 php.ini
sudo systemctl restart php-fpm
# Dockerfile (官方 php:8.2-fpm 為例)
FROM php:8.2-fpm
# 安裝系統依賴 + PHP 擴展
RUN apt-get update && apt-get install -y --no-install-recommends \
libzip-dev \
&& docker-php-ext-install -j$(nproc) zip \
&& rm -rf /var/lib/apt/lists/*
# 驗證構建時
RUN php -m | grep -q zip && echo "ZipArchive OK"
注意:docker-php-ext-install 腳本會自動處理 phpize、configure、make、make install 並啟用,是**官方推薦方式**。
若無法安裝擴展,可用純 PHP 實現的替代庫(功能受限、性能較差):
composer require php-zip/php-zip
# 或 老牌
composer require chumper/zipper
<?php
use PhpZip\ZipFile;
// 建立 ZIP
$zipFile = new ZipFile();
$zipFile->addFile('content.txt', 'Hello World');
$zipFile->saveAs('demo.zip');
// 解壓
$zipFile = new ZipFile();
$zipFile->openFile('demo.zip');
$zipFile->extractTo('/target/dir');
?>
<?php
// test_zip.php
if (!class_exists('ZipArchive')) {
die("❌ ZipArchive 未加載\n");
}
echo "✅ ZipArchive 可用\n";
$zip = new ZipArchive();
$file = __DIR__ . '/test_' . time() . '.zip';
if ($zip->open($file, ZipArchive::CREATE) !== true) {
die("❌ 無法創建: $file\n");
}
$zip->addFromString('hello.txt', 'Hello ZipArchive @ ' . date('c'));
$zip->close();
echo "✅ 創建成功: $file\n";
// 解壓測試
$zip2 = new ZipArchive();
if ($zip2->open($file) === true) {
$zip2->extractTo(__DIR__ . '/unzip_test');
$zip2->close();
echo "✅ 解壓成功\n";
}
@unlink($file);
@rmdir(__DIR__ . '/unzip_test');
?>
| 現象 | 原因 | 解決 |
|---|---|---|
| php.ini 已啟用但 php -m 無 zip | 編輯錯誤的 php.ini (CLI vs FPM 路徑不同) | php --ini 看 Loaded Configuration File,修改該文件 |
| Windows: "無法加載動態庫 php_zip.dll" | DLL 版本不匹配 (TS/NTS/x86/x64/PHP版本) | 下載完全一致的 DLL;php -i | findstr "Thread Safety" 看 TS/NTS |
| Linux: configure: error: Please reinstall the libzip distribution | 缺 libzip-dev / libzip-devel | 安裝系統依賴包 |
| Docker: zip 擴展安裝後不可用 | 基礎鏡像缺 libzip,未裝系統依賴直接 docker-php-ext-install | 先 apt-get install libzip-dev 再 install |
| 大文件 (>2GB) 壓縮失敗 | ZipArchive 32位限制 / Zip64 支持 | 確保 libzip 1.6+、PHP 7.3+、啟用 Zip64 (默認開啟) |
PHP 進程內壓縮大文件易 OOM/超時,建議調用系統 zip/7z:
<?php
function zipDirectory(string $source, string $dest, int $compressionLevel = 6): bool
{
$source = realpath($source);
if (!$source || !is_dir($source)) return false;
$cmd = sprintf(
'cd %s && zip -r -%d %s . 2>&1',
escapeshellarg($source),
$compressionLevel,
escapeshellarg($dest)
);
exec($cmd, $output, $code);
return $code === 0;
}
// 解壓
function unzipFile(string $zipPath, string $dest): bool
{
$cmd = sprintf('unzip -o %s -d %s 2>&1', escapeshellarg($zipPath), escapeshellarg($dest));
exec($cmd, $output, $code);
return $code === 0;
}
?>
總結: 95% 情況下,Linux 用包管理器安裝 php-zip,Windows 去掉 php.ini 分號,Docker 用 docker-php-ext-install zip 即可解決。剩下 5% 看編譯錯誤日誌補依賴。