#php #ziparchive #php-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
Ответ №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);
Комментарии:
1. Вы также можете использовать
ZipArchive::OVERWRITE
вместоZipArchive::CREATE
, чтобы временный файл никогда не удалялся.2. Блестяще! Не знаю, как я это пропустил. Спасибо. Намного лучше, чем удаление только что созданного временного файла.