将 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);
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);