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 "Файл создан";
}Файл создан
$fp = gzopen('compressed.gz', 'r', 1);
if ($fp === false) {
echo "Не удалось открыть файл";
} else {
$content = gzread($fp, 1024);
echo "Прочитано: " . strlen($content) . " байт";
gzclose($fp);
}Прочитано: 1024 байт
Альтернативные функции в PHP
Читает весь gzip файл в массив. Подходит для небольших файлов, так как загружает все содержимое в память.
Сжимают и распаковывают строки в формате gzip без работы с файловой системой. Удобны для обработки данных в памяти.
Позволяет использовать 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 символов содержимого
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 модуля.
Типичные ошибки
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
Функция теперь возвращает ресурс типа GzFile вместо обычного ресурса. Это улучшает типизованность кода.
Добавлена поддержка режима c (compress only) для создания файлов только со сжатыми данными без заголовков gzip.
Добавлена поддержка контекста потоков через параметр context. Позволяет задавать дополнительные опции при открытии файлов.
Расширенные примеры
$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 байт ...
$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 "Файлы объединены";Файлы объединены
$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% Завершено
$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);
}Первая строка: заголовок данных
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 с добавленными записями