вот небольшой код, который я написал:
file_put_contents('a.upl', '');
try
{
$x = new \ZipArchive();
$x->open('a.upl');
}
catch(\Exception $e)
{
echo $e->getMessage();
}
он выдает сообщение ZipArchive::open(): Using empty file as ZipArchive is deprecated, что неудивительно.
Что удивительно, этот a.upl файл удаляется, что немного странно. Почему он это делает? И как предотвратить эту "секретные материалы, магию"?
Возможно, необходимы дополнительные разъяснения? С помощью $x->open('a.upl'); вы открываете a.upl как ZIP-архив. Он пытается добавить пустой файл в ZIP-архив. Для этого вам понадобится addFile(). В своем вопросе вы прямо не указываете, что понимаете это, хотя, вероятно, понимаете. Просто код выглядит немного странно.
Если посмотреть на исходный код PHP, то окажется, что PHP выдает предупреждение об устаревании и устанавливает флаг ZIP_TRUNCATE, передавая его в libzip. Удаление должно происходить в libzip, а не в PHP.






Покопался в исходниках, последовательность событий такая:
PHP видит, что файл, который вы предоставили, пуст, последняя версия libzip не позволяет этого, поэтому при подготовке к этому разрыву BC PHP устанавливает флаг ZIP_TRUNCATE при вызове zip_open libzip.
https://github.com/php/php-src/blob/master/ext/zip/php_zip.c#L1500
libzip, получив этот флаг, создает в памяти новый zip-объект, связанный с этим файлом в качестве источника.
Когда вы затем не добавляете в него никаких файлов и скрипт завершает работу, libzip вызывает zip_close, и поскольку установлен флаг ZIP_TRUNCATE и в zip-архиве нет записей, исходный файл удаляется.
https://github.com/nih-at/libzip/blob/cf7bf43ba2f85f936705231903aa0d5cfb2fdf11/lib/zip_close.c#L68
Вы можете избежать магии x-файлов, установив этот глобальный флаг: https://www.php.net/manual/en/zip.constants.php#ziparchive.constants.afl-create-or-keep-file-for -empty-archive (если ваша версия libzip >= 1.10)
Вероятно, ситуация аналогична той, которую объясняет php.net/manual/en/ziparchive.open.php#117082, я полагаю. Когда вы открываете новый архив и не добавляете в него никаких файлов, ZIP-файл фактически не создается. Я предполагаю, что в этой ситуации исходный файл, вероятно, будет удален, как только вы попытаетесь его открыть, и если вы затем не добавите к нему какой-либо файл, он не будет создан заново.