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

Функция gzread в PHP: чтение данных из gz-файлов
Раздел: Сжатие
gzread(resource $stream, int $length): string|false
Описание функции gzread

Функция gzread применяется для чтения данных из файла, сжатого с помощью gzip. Она входит в состав модуля Zlib и используется при работе с архивами формата .gz или сжатыми потоками данных.

gzread позволяет читать бинарные или текстовые данные из открытого дескриптора gz-файла. Часто функция применяется для обработки больших сжатых логов, дампов баз данных или любых других данных, где важно экономить место на диске.

Аргументы функции
  • $stream (resource) – обязательный аргумент. Дескриптор файла, полученный с помощью gzopen.
  • $length (int) – обязательный аргумент. Количество байтов для чтения. После чтения указанного количества байтов или достижения конца файла (EOF) функция прекращает работу.

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

Короткие примеры использования
Чтение всего файла
<?
$handle = gzopen('example.gz', 'r');
$contents = '';
while (!gzeof($handle)) {
    $contents .= gzread($handle, 1024);
}
gzclose($handle);
echo $contents;
?>
(Содержимое файла example.gz)
Чтение определенного количества байтов
<?
$handle = gzopen('data.gz', 'r');
$first100bytes = gzread($handle, 100);
gzclose($handle);
echo $first100bytes;
?>
Первые 100 байт файла data.gz
Похожие функции в PHP

В PHP существует несколько функций для работы со сжатыми данными:

  • gzfile – читает весь gz-файл и возвращает массив строк. Удобно для построчной обработки.
  • gzgetc – читает один символ из gz-файла.
  • gzgets – читает строку из gz-файла.
  • readgzfile – читает и сразу выводит содержимое gz-файла.
  • gzinflate – распаковывает сырые сжатые данные без заголовков gzip.

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

Альтернативы в других языках

Gzread в Python

import gzip
with gzip.open('example.gz', 'rt') as f:
    content = f.read(100)
    print(content)
Первые 100 байт файла example.gz
JavaScript (Node.js)
const zlib = require('zlib');
const fs = require('fs');
const gunzip = zlib.createGunzip();
const input = fs.createReadStream('example.gz');
input.pipe(gunzip).on('data', (chunk) => {
    console.log(chunk.toString());
});
Содержимое файла example.gz

Gzread в MySQL

В MySQL нет прямой аналогии, но можно использовать функцию UNCOMPRESS для распаковки данных, сжатых с помощью COMPRESS, которая использует zlib.

Типичные ошибки
Передача неверного дескриптора
<?
$result = gzread('not_a_resource', 100);
var_dump($result);
?>
Warning: gzread() expects parameter 1 to be resource, string given
bool(false)
Чтение после закрытия дескриптора
<?
$handle = gzopen('test.gz', 'r');
gzclose($handle);
$data = gzread($handle, 100);
?>
Warning: gzread(): supplied resource is not a valid stream resource
Отрицательная длина чтения
<?
$handle = gzopen('test.gz', 'r');
$data = gzread($handle, -1);
?>
Warning: gzread(): Length parameter must be greater than 0
Изменения в последних версиях PHP

В PHP 8.0 функция gzread была переведена в разряд строго типизированных. Аргумент $length теперь ожидает целочисленное значение (int). Передача нецелочисленного значения вызовет TypeError.

В PHP 7.4 были улучшены сообщения об ошибках при работе с некорректными дескрипторами.

Расширенные примеры
Постепенное чтение и обработка данных
Пример php
<?
function processGzFile($filename, $chunkSize = 4096) {
    $handle = gzopen($filename, 'r');
    if (!$handle) {
        return false;
    }
    $totalBytes = 0;
    while (!gzeof($handle)) {
        $chunk = gzread($handle, $chunkSize);
        $totalBytes += strlen($chunk);
        // Обработка чанка данных
        echo "Прочитано байт: $totalBytes\n";
    }
    gzclose($handle);
    return $totalBytes;
}
processGzFile('large_log.gz');
?>
Прочитано байт: 4096
Прочитано байт: 8192
...
Чтение бинарных данных
Пример php
<?
$handle = gzopen('image.gz', 'rb');
$header = gzread($handle, 10);
$binaryData = gzread($handle, 1024);
gzclose($handle);
echo bin2hex($header);
?>
89504e470d0a1a0a0000 (заголовок PNG-файла)
Обработка CSV файла
Пример php
<?
$handle = gzopen('data.csv.gz', 'r');
$firstLine = gzgets($handle); // Чтение заголовка
while (!gzeof($handle)) {
    $line = gzgets($handle);
    $data = str_getcsv($line);
    print_r($data);
}
gzclose($handle);
?>
Array
(
    [0] => value1
    [1] => value2
)
...
Чтение с использованием stream_context
Пример php
<?
$context = stream_context_create(['zlib' => ['level' => 6]]);
$handle = gzopen('file.gz', 'r', false, $context);
$content = gzread($handle, filesize('file.gz'));
gzclose($handle);
?>
(Содержимое файла file.gz)

PHP gzread function comments

En
Gzread Binary-safe gz-file read