将 ZipArchive 与 PHP 8 和临时文件结合使用

Dav*_*ave 8 php ziparchive php-8

PHP 8 改变了 ZIP 存档的“打开”方式,值得注意的是:

不推荐使用空文件作为 ZipArchive。Libzip 1.6.0 不再接受空文件作为有效的 zip 存档。

在下面的测试代码中,打开名为 的 ZIP 文件$backupzip可以正常工作,但打开 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
Run Code Online (Sandbox Code Playgroud)

Dav*_*ave 14

失败是由于该tempnam函数的使用实际上创建了一个零字节文件而引起的,这就是所ZipArchive::CREATE抱怨的。

解决方案是在尝试使用它之前unlink创建临时文件。tempnam在问题的示例中,我只是unlink($temp_file);$temp_file = tempnam(sys_get_temp_dir(),'AW');.

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

<?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);
Run Code Online (Sandbox Code Playgroud)

  • 您还可以使用“ZipArchive::OVERWRITE”而不是“ZipArchive::CREATE”,因此临时文件永远不会被删除。 (20认同)