Gzread: примеры (PHP)
gzread(resource $stream, int $length): string|falseФункция 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 существует несколько функций для работы со сжатыми данными:
- 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
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 8.0 функция gzread была переведена в разряд строго типизированных. Аргумент $length теперь ожидает целочисленное значение (int). Передача нецелочисленного значения вызовет TypeError.
В PHP 7.4 были улучшены сообщения об ошибках при работе с некорректными дескрипторами.
<?
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 ...
<?
$handle = gzopen('image.gz', 'rb');
$header = gzread($handle, 10);
$binaryData = gzread($handle, 1024);
gzclose($handle);
echo bin2hex($header);
?>89504e470d0a1a0a0000 (заголовок PNG-файла)
<?
$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
)
...<?
$context = stream_context_create(['zlib' => ['level' => 6]]);
$handle = gzopen('file.gz', 'r', false, $context);
$content = gzread($handle, filesize('file.gz'));
gzclose($handle);
?>(Содержимое файла file.gz)