Используя PHP, как я могу определить (распаковать, если применимо) и извлечь файлы из файлов.tar, .gz, .tar.gz, .zip?
Я знаю это \Phar
а также \PharData
существуют, но у меня есть некоторые проблемы с методами, которые они поставляют до сих пор. Мне все еще нужно определить mime-тип / тип файла любыми средствами, прежде чем определить, какой Phar*::method()
использовать для извлечения архива и работы с файлами, которые в нем содержатся.
Есть ли какой-нибудь класс "easy-button", который я мог бы включить (возможно, какой-то пакет, доступный через composer), который обрабатывает это на очень высоком уровне? Или я не могу использовать Phar
и друзья правильно или нуждаются в повторном RTM до сих пор?
По сути, я хочу сделать следующее (это сценарий CLI, который я сейчас контролирую, поэтому безопасность, хотя и важна для такого рода вещей, пока находится в тупике):
- Определите, что файл может быть каким-то архивом.
- Проверьте, кажется ли это одним из следующих:
.tar
,.gz
,.tar.gz
, или же.zip
, - Если это так, попытайтесь извлечь архив, а затем проанализировать содержимое его фактических файлов.
Есть ли "легкая кнопка" для этого, о которой я не знаю, или мне нужно построить какую-то логику, которая как можно лучше угадывает, какой это тип архива, а затем попытаться использовать соответствующий Phar*
метод, чтобы попытаться извлечь его файлы и делать с ними все, что мне нужно?
Я надеюсь, что это имеет смысл, как я это написал. Я стараюсь не изобретать колесо для мини-проекта, если кто-то уже все понял.
2 ответа
Поэтому, продолжая исследовать это, я в конечном итоге увидел свой собственный (этот) ТАК вопрос в результатах поиска Google, что меня почему-то раздражает. Так что на случай, если кто-то наткнется на это в поисках хорошего решения, я с тех пор нашел пару, выполнив поиск по https://packagist.org/search/?q=archive (см. Рисунок):
Вот некоторые из них, которые кажутся многообещающими.
wapmorgan / UnifiedArchive:
- wapmorgan / UnifiedArchive (packagist)
wapmorgan / UnifiedArchive (источник на github)
Особенности (на первый взгляд):
- Имеет только одно требование
pear/archive_tar
(который включает в себя еще несколько полезных классов также из груши). - Он пытается определить тип файла для вас, поэтому он может устранить необходимость делать это самостоятельно.
- Имеет только одно требование
алхимия / проворный:
- алхимия / молнии (упаковщик)
alchemy-fr / Zippy (источник на github)
Особенности (на первый взгляд):
- Код выглядит очень хорошо разработанным.
- Кажется, интегрироваться с Laravel и
guzzle\guzzle
(популярный PHP-клиент PHP), так что это может быть преимуществом для некоторых.
zetacomponents / Архив
- зетакомпоненты / Архив (упаковщик)
зетакомпоненты / Архив (источник на github)
Особенности (на первый взгляд):
- Кажется, это чистая реализация PHP? Если так, то это просто потрясающе.
- Последний раз обновлялся 15 дней назад, поэтому он является самым активным из трех упомянутых мною.
- Кажется, поддерживается организацией, а не одним человеком.
- На данный момент у него больше всего загрузок на packagist (при поиске "архива"), и хотя я еще не играл с ним, обычно это хороший знак.
Отказ от ответственности: я только на самом деле пытался wapmorgan/UnifiedArchive
на момент написания статьи, и до сих пор это именно то, что я искал.
Во всяком случае, я надеюсь, что это поможет любому, кто может наткнуться на этот вопрос.
Если вам не нужен чистый php и если ваш код работает на Linux-машине,
exec('uncompress [-cfv] [file...]');
или
exec('unzip filename.zip -d destination');
распакует файл и сделает его пригодным для использования на php. Конечно, вам нужно проверить расширение (zip, tar и т. Д.), Чтобы вызвать правильную команду