Использование 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
1 ответ
Неисправность вызвана тем, что использование
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);