Использование ZipArchive с PHP 8 и временными файлами

#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. Блестяще! Не знаю, как я это пропустил. Спасибо. Намного лучше, чем удаление только что созданного временного файла.