Gzopen: примеры (PHP)

Функция gzopen в PHP - полное руководство с примерами
Раздел: Сжатие
gzopen(string $filename, string $mode, int $use_include_path = 0): resource|false

Функция gzopen в PHP

Назначение и применение

Функция gzopen() открывает файл gzip (.gz) для чтения или записи. Она является частью модуля zlib в PHP и предоставляет интерфейс для работы со сжатыми данными в формате gzip. Основное применение - обработка больших сжатых файлов без необходимости их полной распаковки в памяти.

Синтаксис и параметры
resource|false gzopen(string $filename, string $mode, int $use_include_path = 0)

filename - путь к gzip файлу. Может быть локальным или URL (если включена поддержка URL-оберток).

mode - режим открытия файла, аналогичный функции fopen(), но с поддержкой специфичных для gzip модификаторов:

  • r - чтение (файл должен существовать)
  • w - запись (создает или перезаписывает файл)
  • a - добавление в конец
  • x - эксклюзивное создание
  • r+, w+, a+, x+ - чтение и запись
  • Дополнительные модификаторы: 1-9 - уровень сжатия (по умолчанию 6)

use_include_path - если установлен в 1, функция ищет файл также в include_path.

Примеры использования gzopen

Базовое чтение файла
$fp = gzopen('data.gz', 'r');
if ($fp) {
    while (!gzeof($fp)) {
        $buffer = gzread($fp, 4096);
        echo $buffer;
    }
    gzclose($fp);
}
// Выводит содержимое распакованного файла
Запись с указанием уровня сжатия
$fp = gzopen('output.gz', 'w9'); // Максимальное сжатие
if ($fp) {
    gzwrite($fp, "Содержимое для сжатия\n");
    gzwrite($fp, "Вторая строка данных");
    gzclose($fp);
    echo "Файл создан";
}
Файл создан
Чтение с использованием include_path
$fp = gzopen('compressed.gz', 'r', 1);
if ($fp === false) {
    echo "Не удалось открыть файл";
} else {
    $content = gzread($fp, 1024);
    echo "Прочитано: " . strlen($content) . " байт";
    gzclose($fp);
}
Прочитано: 1024 байт

Альтернативные функции в PHP

Читает весь gzip файл в массив. Подходит для небольших файлов, так как загружает все содержимое в память.

gzencode() и gzdecode()

Сжимают и распаковывают строки в формате gzip без работы с файловой системой. Удобны для обработки данных в памяти.

fopen() с потоковыми фильтрами

Позволяет использовать zlib фильтры с обычными файловыми операциями. Более гибкий подход для сложных сценариев.

Когда что использовать

gzopen оптимальна для поточной обработки больших сжатых файлов. gzfile подходит для небольших файлов, где нужно получить массив строк. gzencode/gzdecode используются для работы со строками в памяти.

Аналоги в других языках

Gzopen в Python

import gzip
with gzip.open('file.gz', 'rt', encoding='utf-8') as f:
    content = f.read()
print(content[:100])
Первые 100 символов содержимого
JavaScript (Node.js)
const zlib = require('zlib');
const fs = require('fs');
const readStream = fs.createReadStream('input.gz');
const gunzip = zlib.createGunzip();
readStream.pipe(gunzip).pipe(process.stdout);
Распакованное содержимое в stdout

Gzopen в MySQL

SELECT UNCOMPRESS(compressed_column) 
FROM table 
WHERE id = 1;
Распакованные данные из колонки
Основные отличия

В Python и Node.js работа с gzip часто интегрирована в стандартные библиотеки с поддержкой потоков. В PHP требуется явное использование функций zlib модуля.

Типичные ошибки

Отсутствие модуля zlib
if (!extension_loaded('zlib')) {
    die('Модуль zlib не загружен');
}
$fp = gzopen('file.gz', 'r');
Модуль zlib не загружен
Попытка открыть несжатый файл
$fp = gzopen('text.txt', 'r');
if ($fp === false) {
    echo "Ошибка: файл не в формате gzip";
}
Ошибка: файл не в формате gzip
Неверный режим доступа
$fp = gzopen('file.gz', 'rb'); // 'b' не поддерживается
echo gzerror($fp);
unknown compression level
Утечка ресурсов
$fp = gzopen('large.gz', 'r');
$data = gzread($fp, 1000000);
// gzclose($fp); не вызван
// Утечка дескриптора файла

Изменения в новых версиях PHP

PHP 8.0.0

Функция теперь возвращает ресурс типа GzFile вместо обычного ресурса. Это улучшает типизованность кода.

PHP 7.4.0

Добавлена поддержка режима c (compress only) для создания файлов только со сжатыми данными без заголовков gzip.

PHP 5.4.0

Добавлена поддержка контекста потоков через параметр context. Позволяет задавать дополнительные опции при открытии файлов.

Расширенные примеры

Поточная обработка большого файла
Пример php
$source = gzopen('huge_log.gz', 'r');
$dest = fopen('extracted.log', 'w');
$chunkSize = 8192;

while (!gzeof($source)) {
    $buffer = gzread($source, $chunkSize);
    fwrite($dest, $buffer);
    echo "Обработано: " . ftell($dest) . " байт\n";
}

gzclose($source);
fclose($dest);
Обработано: 8192 байт
Обработано: 16384 байт
...
Конкатенация нескольких gzip файлов
Пример php
$output = gzopen('combined.gz', 'w9');
$files = ['part1.gz', 'part2.gz', 'part3.gz'];

foreach ($files as $file) {
    $input = gzopen($file, 'r');
    while (!gzeof($input)) {
        gzwrite($output, gzread($input, 4096));
    }
    gzclose($input);
}

gzclose($output);
echo "Файлы объединены";
Файлы объединены
Чтение с прогресс-баром
Пример php
$filename = 'archive.gz';
$fp = gzopen($filename, 'r');
$totalSize = filesize($filename);
$read = 0;

while (!gzeof($fp)) {
    $data = gzread($fp, 16384);
    $read += strlen($data);
    $progress = round(($read / $totalSize) * 100, 2);
    echo "Прогресс: {$progress}%\r";
}

gzclose($fp);
echo "\nЗавершено";
Прогресс: 45.67%
Завершено
Работа с HTTP потоками
Пример php
$url = 'http://example.com/data.gz';
$context = stream_context_create(['http' => ['timeout' => 30]]);

$fp = gzopen($url, 'r', 0, $context);
if ($fp) {
    $firstLine = gzgets($fp, 1024);
    echo "Первая строка: $firstLine";
    gzclose($fp);
}
Первая строка: заголовок данных
Создание инкрементального бэкапа
Пример php
function createBackup($data, $backupFile) {
    $mode = file_exists($backupFile) ? 'a' : 'w9';
    $fp = gzopen($backupFile, $mode);
    gzwrite($fp, date('Y-m-d H:i:s') . "\n" . $data . "\n---\n");
    gzclose($fp);
}

createBackup('Лог операции 1', 'backup.gz');
createBackup('Лог операции 2', 'backup.gz');
// Создается файл backup.gz с добавленными записями

PHP gzopen function comments

En
Gzopen Open gz-file