
Архивирование в 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
Сжатие данных может пригодится в работе при:
- каталогизации данных
- создании резервных копий
- отправки отчетов
- получения информации из сжатых данных (при распаковке)
- создании логов
- работе с дампами базы данных
- загрузке данных на сервер и т.д.

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();