Чтение и запись сжатых файлов

Задача
Необходимо прочитать или записать сжатые файлы.

Решение
Для чтения или записи файлов gzip применяется расширение PHP zlib. Чтобы прочитать сжатый файл:

$zh = gzopen('file.gz','r') or die("can't open: $php_errormsg");
while ($line = gzgets($zh,1024)) {
// переменная $line – это следующая строка несжатого файла,
// вплоть до 1024 байт
}
gzclose($zh) or die("can't close: $php_errormsg");

Ниже показано, как записать сжатый файл:

$zh = gzopen('file.gz','w') or die("can't open: $php_errormsg");
if (-1 == gzwrite($zh,$s)) { die("can't write: $php_errormsg"); }
gzclose($zh) or die("can't close: $php_errormsg");

Обсуждение
Расширение zlib поддерживает версии многих функций доступа к файлам, таких как fopen(), fread() и fwrite() (называемых gzopen(), gzread(), gzwrite() и т. д.), которые прозрачно упаковывают данные при записи и распаковывают при чтении. Алгоритм сжатия, реализованный в zlib, совместим с утилитами gzip и gunzip.

Например, функция gzgets($zp,1024) работает подобно fgets($fh,1024). Она читает до 1023 байт, останавливаясь раньше, если встречает EOF или символ новой строки.


Для функции gzgets() это означает 1023 несжатых байт.

Однако функция gzseek() работает иначе, чем функция fseek(). Она поддерживает только поиск определенного количества байт с начала файлового потока (аргумент SEEK_SET в функции fseek()). Поиск в прямом направлении (начиная с текущей позиции) поддерживается, только если файл открыт на запись (файл дополняется последовательностью сжатых нулей). Поиск в обратном направлении поддерживается в файле, открытом на чтение, но он очень медленный.

Расширение zlib также имеет несколько функций для создания сжатых строк. Функция gzencode() сжимает строку и обеспечивает ее корректными заголовками и форматированием для совместимости с gunzip.

Приведем простую программу gzip:

$in_file = $_SERVER['argv'][1];
$out_file = $_SERVER['argv'][1].'.gz';
$ifh = fopen($in_file,'rb') or die("can't open $in_file: $php_errormsg");
$ofh = fopen($out_file,'wb') or die("can't open $out_file: $php_errormsg");
$encoded = gzencode(fread($ifh,filesize($in_file)))
or die("can't encode data: $php_errormsg");
if (-1 == fwrite($ofh,$encoded)) { die("can't write: $php_errormsg"); }
fclose($ofh) or die("can't close $out_file: $php_errormsg");
fclose($ifh) or die("can't close $in_file: $php_errormsg");

Суть этой программы заключена в следующих строках:

$encoded = gzencode(fread($ifh,filesize($in_file)))
or die("can't encode data: $php_errormsg);
if (-1 == fwrite($ofh,$encoded)) { die("can't write: $php_errormsg"); }

Сжатое содержание переменной $in_file запоминается в переменной $encoded, а затем записывается в файл $out_file с помощью функции fwrite().

Функции gzencode() можно передать второй аргумент, задающий степень сжатия.


Устанавливаем режим без сжатия, указав значение 0, и максимальное сжатие, указав значение 9. Уровень по умолчанию равен 1. Чтобы настроить простую программу gzip на максимальное сжатие, надо записать кодирующую строку так:

$encoded = gzencode(fread($ifh,filesize($in_file)),9)
or die("can't encode data: $php_errormsg);

Можно также упаковывать и распаковывать строки без gzip-совместимых заголовков с помощью gzcompress() и gzuncompress().

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела PHP на эту тему:
Блокировка файла
Выбор случайной строки из файла
Запись в несколько файловых дескрипторов одновременно
Запись в стандартный поток вывода
Непосредственная модификация файла без временной копии

Вернуться в раздел: PHP / 18. Файлы