如何解决在PHP 8和临时文件中使用ZipArchive
PHP 8更改了ZIP存档的“打开”方式,并指出:
不推荐使用空文件,因为ZipArchive已弃用。 Libzip 1.6.0不再接受空文件作为有效的zip存档。
在下面的测试代码中,打开名为$backupzip
的ZIP文件不会出现错误,但是打开ZIP文件名$invoicezip
却失败,并显示以下错误:
不建议使用:ZipArchive :: open():在第12行不建议使用空文件作为ZipArchive
<?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');
。
现在的前几行如下:
<?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);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。