Совсем недавно, во время написания небольшого сервиса, мне понадобилось средство для работы с архивами 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 можно использовать свободно.