Php, ZipArchive удаляет пустой файл?

вот небольшой код, который я написал:

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 файл удаляется, что немного странно. Почему он это делает? И как предотвратить эту "секретные материалы, магию"?

Вероятно, ситуация аналогична той, которую объясняет php.net/manual/en/ziparchive.open.php#117082, я полагаю. Когда вы открываете новый архив и не добавляете в него никаких файлов, ZIP-файл фактически не создается. Я предполагаю, что в этой ситуации исходный файл, вероятно, будет удален, как только вы попытаетесь его открыть, и если вы затем не добавите к нему какой-либо файл, он не будет создан заново.

CBroe 26.02.2024 11:23

Возможно, необходимы дополнительные разъяснения? С помощью $x->open('a.upl'); вы открываете a.upl как ZIP-архив. Он пытается добавить пустой файл в ZIP-архив. Для этого вам понадобится addFile(). В своем вопросе вы прямо не указываете, что понимаете это, хотя, вероятно, понимаете. Просто код выглядит немного странно.

KIKO Software 26.02.2024 11:39

Если посмотреть на исходный код PHP, то окажется, что PHP выдает предупреждение об устаревании и устанавливает флаг ZIP_TRUNCATE, передавая его в libzip. Удаление должно происходить в libzip, а не в PHP.

Matt 26.02.2024 12:47
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
3
101
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Покопался в исходниках, последовательность событий такая:

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)

Другие вопросы по теме