Совсем недавно, во время написания небольшого сервиса, мне понадобилось средство для работы с архивами tar.gz. Гугл, вопреки ожиданиям, ничего внятно-понятного предложить не смог. Использовать exec почему-то не хотелось.. Было принято решение выдернуть нужный функционал из Битрикса, благо с архивами он работает довольно неплохо.

Битрикс, поделись кодом:)

Итак, первым делом копируем нужный нам php-файл. Он называется tar_gz.php и лежит в \bitrix\modules\main\classes\general\ Дополнительных скриптов класс не подтягивает, поэтому можно смело забирать только его.

Из всего набора возможностей, содержащихся в классе CArchiver, использовать будем только 2 метода — для архивирования и распаковки группы файлов.

Конструктор класса CArchiver выглядит так

function CArchiver($strArchiveName, $bCompress = false, $start_time = -1, $max_exec_time = -1, $pos = 0, $stepped = false)

Где
$strArchiveName — имя создаваемого архива или путь до существующего
$bCompress — флаг сжатия для нового архива

Остальные параметры используются в пошаговом режиме и рассматриваться в рамках этой статьи не будут

Архивирование

Для создания архива применим метод

function Add($vFileList, $strAddPath = false, $strRemovePath = false)

Где
$vFileList — путь до файла (или каталога), который надо архивировать
$strAddPath — строка, которая будет добавляться в начало пути архивируемых объектов (пояснение ниже:)
$strRemovePath — часть пути $vFileList, которая не будет помещена в архив

Например, у нас есть каталог future/mega/arc, который надо запаковать в result/test.tar.gz. При этом внутри архива future/mega/ быть не должно, вместо этого должно получиться new_folder/new/arc

require_once('tar_gz.php');
// имя архива
$tmpfname = "result/test.tar.gz";
// содержимое этого каталога будем архивировать
$folder = "future/mega/arc";
// создаем объект, флаг сжатия установлен
$oArchiver = new CArchiver($tmpfname, true);
// делаем архив, убираем future/mega/, добавляем new_folder/new
$tres = $oArchiver->add('"'.$folder.'"', "new_folder/new", "future/mega/");
// вывод ошибок если есть
$arErrors = &$oArchiver->GetErrors();
        if(count($arErrors)>0)
        {
            $strError = "<br>";
            foreach ($arErrors as $value)
                $strError .= "[".$value[0]."] ".$value[1]."<br>";
        }
        else
            $strError = ".<br>";
echo $strError;

Разархивирование

Для распаковки используется метод

function extractFiles($strPath, $vFileList = false)

Где в качестве первого параметра указываем путь к каталогу, куда надо извлечь файлы.

Например, распаковываем result/test.tar.gz в yes/my/arc/extract/

require_once('tar_gz.php');
// имя архива
$tmpfname = "result/test.tar.gz";
// куда распаковывать
$folder = "yes/my/arc/extract";
// создаем объект
$oArchiver = new CArchiver($tmpfname);
// поеееехали!
$tres = $oArchiver->extractFiles($folder);
// вывод ошибок если есть
$arErrors = &$oArchiver->GetErrors();
        if(count($arErrors)>0)
        {
            $strError = "<br>";
            foreach ($arErrors as $value)
                $strError .= "[".$value[0]."] ".$value[1]."<br>";
        }
        else
            $strError = ".<br>";
echo $strError;

Вот так, быстро, удобно, но не совсем лицензионно можно работать с tar.gz архивами в php.

PS: если Вы никогда не работали с битриксом и не знаете где взять tar_gz.php — процесс выглядит примерно так: ищем в сети bitrix 7.5+ (ниже не проверял) в исходных кодах (в сети полно) и прямо из архива выдергиваем этот файл.

Больше статей и материалов по web-разработке в tg-канале - подписывайтесь!

Подписаться в telegram

4 комментария “Работа с архивами tar.gz в php

  1. Санёк

    Не работае!

    [ERR_OPEN_WRITE] Unable to open ‘путь к архиву’ in write mode. Права в папке 777!

  2. Санёк

    О великий, оно заработало! Слава тебе и да пребудет с тобой Сила!

  3. iVariable

    Спасибо большое, очень выручил :) Как раз пригодилось для битрикса :)

  4. Константин

    Здравствуйте, Алексей, судя по методам класса CArchiver в tar_gz.php, код заимствован из модуля PEAR ‘Archive_Tar’ (http://pear.php.net/package/Archive_Tar). Если волнует вопрос лицензионности кода, то библиотеки PEAR можно использовать свободно.

Добавить комментарий

Ваш адрес email не будет опубликован.