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

Author: Anand Shah, 2017-08-06

1 answers

Используйте родительский элемент "родительской папки" в качестве основы для Phar::buildFromDirectory() и используйте его второй параметр, чтобы ограничить результаты только "родительской папкой", например:

$parent = dirname("parent-folder");
$pd->buildFromDirectory($parent, '#^'.preg_quote("$parent/parent-folder/", "#").'#');
$pd->compress(Phar::GZ);
 2
Author: Paul Crovella, 2017-08-06 11:20:48