Create.tar.gz файл с использованием PHP
Проект, над которым я работаю, требует создания.tar.gz архивирует и передает его во внешнюю службу. Эта внешняя служба работает только с.tar.gz так что о другом типе архива не может быть и речи. Сервер, на котором будет выполняться код, над которым я работаю, не разрешает доступ к системным вызовам. Так что system
, exec
, отступления и т. Д. - это не буэно. Это означает, что я должен полагаться на чистую реализацию PHP для создания.tar.gz файлы.
Проведя небольшое исследование, кажется, что PharData
будет будьте полезны для достижения результата. Однако я столкнулся с этим и нуждаюсь в некотором руководстве.
Рассмотрим следующий макет папки:
parent folder
- child folder 1
- child folder 2
- file1
- file2
Я использую приведенный ниже фрагмент кода для создания.tar.gz архив, который делает свое дело, но есть небольшая проблема с конечным результатом, он содержит не родительскую папку, а все, что в ней находится.
$pd = new PharData('archive.tar');
$dir = realpath("parent-folder");
$pd->buildFromDirectory($dir);
$pd->compress(Phar::GZ);
unset( $pd );
unlink('archive.tar');
При создании архива он должен содержать точный макет папки, упомянутый выше. Используя вышеупомянутый код фрагмент, архив содержит все, кроме родительской папки, которая является прерывателем сделки для внешней службы:
- child folder 1
- child folder 2
- file1
- file2
В описании buildFromDirectory
упоминается следующее, поэтому понятно, что оно не содержит родительской папки в архиве:
Создайте архив tar/zip из файлов в каталоге.
Я также пытался использовать buildFromIterator
, но конечный результат с ним также одинаков, т.Е. родительская папка не включена в архив. Я был способен получить желаемый результат с помощью addFile
, но это мучительно медленно.
Проведя немного больше исследований, я нашел следующую библиотеку: https://github.com/alchemy-fr/Zippy . Но для этого требуется поддержка composer
, которая недоступна на сервере. Я был бы признателен, если бы кто-нибудь мог помочь мне в достижении конечного результата. Я также открыт для использования некоторых других методов или библиотек до тех пор, пока их чистая реализация на PHP не требует каких-либо внешних зависимостей. Не уверен если это поможет, но сервер, на котором будет выполняться код, имеет PHP 5.6
1 answers
Используйте родительский элемент "родительской папки" в качестве основы для Phar::buildFromDirectory()
и используйте его второй параметр, чтобы ограничить результаты только "родительской папкой", например:
$parent = dirname("parent-folder");
$pd->buildFromDirectory($parent, '#^'.preg_quote("$parent/parent-folder/", "#").'#');
$pd->compress(Phar::GZ);