PHP 8 改变了 ZIP 存档的“打开”方式,值得注意的是:
不推荐使用空文件作为 ZipArchive。 Libzip 1.6.0 不再接受空文件作为有效的 zip 存档。
在下面的测试代码中,打开名为
$backupzip
的 ZIP 文件没有错误,但打开 ZIP 文件名 $invoicezip
失败并出现错误:
已弃用:ZipArchive::open():使用空文件,因为 ZipArchive 在第 12 行已弃用
<?php
declare(strict_types=1);
ini_set('display_errors','1');ini_set('display_startup_errors','1');error_reporting(E_ALL);
define('BACKUPDIR','E:\Database_Backups\\');
$backupfile = BACKUPDIR . date('Ymd') . '.zip';
$temp_file = tempnam(sys_get_temp_dir(),'AW');
$backupzip = new ZipArchive();
$invoicezip = new ZipArchive();
$backupzip->open($backupfile,ZipArchive::CREATE); // <<<--- this works
$invoicezip->open($temp_file,ZipArchive::CREATE); // <<<--- this fails
失败的原因是使用
tempnam
函数实际上创建了一个零字节文件,这就是 ZipArchive::CREATE
所抱怨的。
解决方案是在尝试使用之前
unlink
创建的临时文件。在问题的示例中,我只是在 tempnam
之后立即添加了 unlink($temp_file);
。前几行现在看起来像这样:
$temp_file = tempnam(sys_get_temp_dir(),'AW');