将 ZipArchive 与 PHP 8 和临时文件一起使用

Using ZipArchive with PHP 8 and temporary files

PHP 8 更改了 ZIP 存档的“打开”方式,并指出:

Using empty file as ZipArchive is deprecated. Libzip 1.6.0 do not accept empty files as valid zip archives any longer.

在下面的测试代码中,打开名为 $backupzip 的 ZIP 文件没有错误,但打开名为 $invoicezip 的 ZIP 文件失败并出现错误:

Deprecated: ZipArchive::open(): Using empty file as ZipArchive is deprecated on line 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 创建的临时文件,然后再尝试使用它。在问题的示例中,我只是在 $temp_file = tempnam(sys_get_temp_dir(),'AW');.

之后立即添加了 unlink($temp_file);

前几行现在看起来像这样:

<?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');
unlink($temp_file);