Опубликовано Оставить комментарий

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

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

Архивирование в PHP реализуется более чем пятью расширениями: Bzip2, LZF (быстрый алгоритм сжатия), Rar (знаком многим), Phar (PHP Archive), Zip (чтение и запись ZIP-архивов), Zlib (работа с gzip-файлами). Работе с GZIP посвящена статья в phpArch за август 2015 года. Этот вид сжатия основан на алгоритме DEFLATE (комбинация алгоритмов Хаффмана и LZ77). LZ77 создан Авраамом Лемпелем и Яковом Зивом в 1977.

Один из алгоритмов сжатия LZ77:
CSS-properties: background-color and background
CSS-properties: background-color and <16,11>

Один из алгоритмов сжатия, Хаффмана:
hello world
— строка содержит 88 бит

Символ Вес Код по Хаффману
h  1  000
e  1  001
(пробел)  1 010
w  1 011
l  3 10
o  2 110
r  1 1110
d  1 1111

Получается всего 32 бита:

h  e  l  l  o  w  o  r  l  d
 000  001  10  10  110  010  011  110  1110  10  1111

 

Сжатие данных в PHP

Сжатие данных может пригодится в работе при:

  • каталогизации данных
  • создании резервных копий
  • отправки отчетов
  • получения информации из сжатых данных (при распаковке)
  • создании логов
  • работе с дампами базы данных
  • загрузке данных на сервер и т.д.
Файл compression.php содержит код из этой заметки
Сжатие данных в PHP. Файл compression.php содержит код из этой заметки

PHP и GZIP

Zlib — http://php.net/manual/ru/ref.zlib.php

Пример записи с GZIP:


$simpleFile = 'file.txt';
$archiveFile= 'file.txt.gz';
$data= file_get_contents($simpleFile);
// 9 - это максимальное сжатие (работает медленно)
$gzipData= gzencode($data, 9);
file_put_contents($archiveFile, $gzipData)

Пример чтения с GZIP:


$archiveFile= 'file.txt.gz';
$gzipData= file_get_contents($archiveFile);
echo $data = gzdecode ($gzipData);

PHP и ZIP

ZIP — http://php.net/manual/ru/book.zip.php

Пример записи с ZIP:

define("ARCH_NAME","arch.zip");
$zip = new ZipArchive();

if ($zip->open(ARCH_NAME, ZipArchive::CREATE)!==TRUE) {
    exit("Невозможно открыть <".ARCH_NAME.">\n");
}

$zip->addFromString(time()."arch.txt", "#1 Это тестовая строка, добавленная как arch.txt\n");
$zip->addFromString(time()."arch2.txt", file_get_contents("file.txt")."\n");

$zip->addFile("arch4.txt");
echo "numfiles: " . $zip->numFiles . "\n";
echo "status:" . $zip->status . "\n";
$zip->close();

Пример распаковки с ZIP:

define("ARCH_NAME","arch.zip");
$zip = new ZipArchive;
if ($zip->open( ARCH_NAME ) === TRUE) {
    $zip->extractTo('testzip/');
    $zip->close();
    echo 'распаковано в testzip';
} else {
    echo 'ошибка';
}

Пример чтения с GZIP:

define("ARCH_NAME","arch.zip");
if( file_exists( ARCH_NAME ) ){
 $zf = zip_open(ARCH_NAME);
 if( $zf )
  while ($item = zip_read($zf) ){
    echo "$item<br>";    
    echo is_dir(zip_entry_name($item)) ? "папка":"файл";
    echo "<br>";
    echo "Название файла: ",zip_entry_name($item),"<br>";
    echo "Метод сжатия: ",zip_entry_compressionmethod($item),"<br>";
    echo "Уровень сжатия: ",zip_entry_compressedsize ($item),"<br>";
    echo "Размер файла: ",zip_entry_filesize ($item),"байт<br><br>";
    echo zip_entry_read($item),"<hr><br>";    
  }
 zip_close( $zf );
}

PHP и RAR

RAR — http://php.net/manual/ru/book.rar.php

Внимание! Не забудьте найти и подключить php_rar.dll (ссылка временная)
Пример распаковки RAR-архива в PHP

$rar_arch = RarArchive::open("file.rar");
if ($rar_arch === FALSE)
    die("Невозможно открыть RAR архив.");

$rar_entries = $rar_arch->getEntries();
if ($rar_entries === FALSE)
    die("Удалось получить записи.");

echo "Найдено записей: " . count($rar_entries) . ".\n";

foreach ($rar_entries as $e) {
    echo $e;
    echo file_get_contents($e->getName());
    echo $e->extract("");
    echo "\n";
}
$rar_arch->close();
Добавить комментарий