Использование 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);
Другие вопросы по тегам