<?php
$zip = new ZipArchive();
if ($zip->open('F:\test.zip', ZIPARCHIVE::OVERWRITE === TRUE)) { // ❌ 錯誤寫法
$zip->addFile("1439879545373869963.jpg");
zip_close(); // ❌ 過時函數,應用 $zip->close()
echo 'ok';
} else {
echo 'failed';
}
ZIPARCHIVE::OVERWRITE === TRUE 先執行,**比較常數值**,結果為 false (整數 ≠ 布爾)。實際傳給 open() 的第二參數是 false (即 0),而非 ZIPARCHIVE::OVERWRITE (值為 8)。
正確寫法:
if ($zip->open('F:\test.zip', ZIPARCHIVE::OVERWRITE) === TRUE) {
// 成功邏輯
}
PHP 雙引號字符串中 \t 會被解析為制表符。Windows 路徑建議:
'F:\test.zip'"F:\\test.zip""F:/test.zip" (跨平台推薦)zip_close()PHP 5.2+ 推薦面向對象風格:$zip->close()。
<?php
header("Content-Type: text/html; charset=utf-8");
$zip = new ZipArchive();
$zipPath = 'F:/test.zip'; // 正斜槓避免轉義
$fileToAdd = '1439879545373869963.jpg';
// 檢查文件存在
if (!file_exists($fileToAdd)) {
die("源文件不存在: $fileToAdd");
}
// 正確調用 open:第二參數為常數,=== TRUE 判斷返回值
$res = $zip->open($zipPath, ZIPARCHIVE::OVERWRITE | ZIPARCHIVE::CREATE);
if ($res === TRUE) {
$zip->addFile($fileToAdd);
$zip->close(); // 正確關閉
echo "壓縮成功: $zipPath";
} else {
// 錯誤碼對照:https://www.php.net/manual/en/ziparchive.open.php
$errors = [
ZIPARCHIVE::ER_EXISTS => '文件已存在',
ZIPARCHIVE::ER_INCONS => '壓縮包不一致',
ZIPARCHIVE::ER_MEMORY => '記憶體不足',
ZIPARCHIVE::ER_NOENT => '文件不存在',
ZIPARCHIVE::ER_NOZIP => '非有效壓縮包',
ZIPARCHIVE::ER_OPEN => '無法打開文件',
ZIPARCHIVE::ER_READ => '讀取失敗',
ZIPARCHIVE::ER_SEEK => '定位失敗',
];
echo "壓縮失敗,錯誤碼: $res - " . ($errors[$res] ?? '未知錯誤');
}
function zipDirectory($sourceDir, $zipPath) {
$zip = new ZipArchive();
if ($zip->open($zipPath, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE) !== TRUE) {
throw new Exception("無法創建壓縮包: $zipPath");
}
$sourceDir = rtrim($sourceDir, '/\\');
$files = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($sourceDir, RecursiveDirectoryIterator::SKIP_DOTS),
RecursiveIteratorIterator::LEAVES_ONLY
);
foreach ($files as $file) {
if ($file->isFile()) {
$relativePath = substr($file->getPathname(), strlen($sourceDir) + 1);
$zip->addFile($file->getPathname(), $relativePath);
}
}
$zip->close();
return true;
}
| 常數 | 值 | 含義 | 排查方向 |
|---|---|---|---|
| ER_OPEN | 11 | 無法打開文件 | 路徑錯誤、權限不足、磁碟滿 |
| ER_NOENT | 10 | 文件不存在 | addFile 路徑錯誤、相對路徑基準目錄錯誤 |
| ER_MEMORY | 14 | 記憶體不足 | 大文件分塊壓縮、增加 memory_limit |
| ER_INCONS | 13 | 壓縮包不一致 | 並發寫入衝突、文件損壞 |
總結:open() 判斷必須分離 === TRUE,**不要**將常數比較寫在參數裡;路徑用正斜槓;改用 $zip->close();檢查錯誤碼定位具體原因。