Совсем недавно, во время написания небольшого сервиса, мне понадобилось средство для работы с архивами 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
Не работае!
[ERR_OPEN_WRITE] Unable to open ‘путь к архиву’ in write mode. Права в папке 777!
О великий, оно заработало! Слава тебе и да пребудет с тобой Сила!
Спасибо большое, очень выручил :) Как раз пригодилось для битрикса :)
Здравствуйте, Алексей, судя по методам класса CArchiver в tar_gz.php, код заимствован из модуля PEAR ‘Archive_Tar’ (http://pear.php.net/package/Archive_Tar). Если волнует вопрос лицензионности кода, то библиотеки PEAR можно использовать свободно.