Gzfile: примеры (PHP)
gzfile(string $filename, int $use_include_path = 0): array|falseФункция gzfile в PHP
Функция gzfile() предназначена для чтения всего содержимого gzip-сжатого файла и возврата его в виде массива строк. Каждый элемент массива соответствует строке в исходном файле, включая символы новой строки.
Функция применяется при работе с сжатыми текстовыми файлами, логированием в сжатые файлы, чтением больших gzip-архивов построчно без полной распаковки в память.
array gzfile(string $filename, int $use_include_path = 0)
filename: Путь к сжатому файлу. Если параметр use_include_path равен 1, функция также ищет файл в include_path.
use_include_path: Необязательный параметр. При значении 1 функция ищет файл также в include_path. По умолчанию 0.
Примеры использования gzfile
Чтение сжатого файла и вывод содержимого:
$lines = gzfile('example.txt.gz');
foreach ($lines as $line_num => $line) {
echo "Строка #{$line_num}: " . htmlspecialchars($line) . "<br>";
}Строка #0: Первая строка файла Строка #1: Вторая строка файла Строка #2: Третья строка файла
// Установка include_path
ini_set('include_path', '/путь/к/директории');
// Поиск файла в include_path
$lines = gzfile('compressed.log.gz', 1);
if ($lines !== false) {
echo 'Прочитано строк: ' . count($lines);
}Прочитано строк: 150
Похожие функции в PHP
Позволяют читать сжатые файлы частями с использованием файлового указателя. Предпочтительны для работы с очень большими файлами.
Аналогична gzfile(), но работает с несжатыми файлами. Используется, когда не требуется обработка сжатых данных.
Читает строку из gzip-файла и парсит её как CSV. Полезно при работе со сжатыми CSV-данными.
Использование потока zlib:// для чтения всего содержимого сжатого файла в строку. Удобно при необходимости получить содержимое целиком.
Аналоги в других языках
Gzfile в Python
Модуль gzip с методами readlines() или обработкой файла как итератора:
import gzip
with gzip.open('example.txt.gz', 'rt') as f:
lines = f.readlines() # или построчное чтение
for line in lines:
print(line.strip())Первая строка файла Вторая строка файла
Использование модуля zlib и fs для чтения сжатых файлов построчно:
const zlib = require('zlib');
const fs = require('fs');
const gunzip = zlib.createGunzip();
const input = fs.createReadStream('example.txt.gz');
const readline = require('readline');
const rl = readline.createInterface({
input: input.pipe(gunzip)
});
rl.on('line', (line) => {
console.log(`Строка: ${line}`);
});Gzfile в MySQL
Компрессия данных осуществляется на уровне протокола или через функции COMPRESS()/UNCOMPRESS(). Прямого аналога чтения строк из gzip-файла нет.
Типичные ошибки
$lines = gzfile('non_existent.gz');
if ($lines === false) {
echo 'Ошибка при чтении файла';
}Warning: gzfile(non_existent.gz): failed to open stream: No such file or directory Ошибка при чтении файла
// Файл не является корректным gzip-архивом
$lines = gzfile('regular.txt');
var_dump($lines);Warning: gzfile(regular.txt): failed to open stream: not in gzip format bool(false)
// Чтение очень большого сжатого файла целиком
$lines = gzfile('huge_file.gz'); // Может вызвать исчерпание памятиРекомендуется использовать gzopen() с построчным чтением для больших файлов.
Изменения в новых версиях PHP
Функция gzfile() стабильна и практически не менялась в последних версиях PHP. В PHP 8.0 улучшена обработка ошибок - многие функции, включая gzfile(), теперь выбрасывают исключения в случае неудачи вместо генерации предупреждений, если не настроен обработчик ошибок. Поведение при передаче неверных аргументов стало более строгим.
Расширенные примеры использования
// Чтение и парсинг сжатого CSV-файла
$lines = gzfile('data.csv.gz');
$data = [];
foreach ($lines as $line) {
$data[] = str_getcsv(trim($line));
}
print_r(array_slice($data, 0, 3));Array
(
[0] => Array
(
[0] => id
[1] => name
[2] => value
)
[1] => Array
(
[0] => 1
[1] => item1
[2] => 100
)
[2] => Array
(
[0] => 2
[1] => item2
[2] => 200
)
)// Поиск строк, содержащих определенную подстроку
$lines = gzfile('access.log.gz');
$search = 'POST /api/';
$filtered = [];
foreach ($lines as $line) {
if (str_contains($line, $search)) {
$filtered[] = $line;
}
}
echo 'Найдено совпадений: ' . count($filtered);Найдено совпадений: 42
// Сравнение содержимого двух gzip-файлов
$file1 = gzfile('old_backup.gz');
$file2 = gzfile('new_backup.gz');
$diff = array_diff($file1, $file2);
if (empty($diff)) {
echo 'Файлы идентичны';
} else {
echo 'Найдено различий в строках: ' . count($diff);
}Найдено различий в строках: 15
// Обработка файла с многострочными JSON-объектами
$lines = gzfile('multiline.json.gz');
$jsonBuffer = '';
$objects = [];
foreach ($lines as $line) {
$jsonBuffer .= $line;
if (trim($line) === '}') {
$objects[] = json_decode($jsonBuffer, true);
$jsonBuffer = '';
}
}
echo 'Обработано объектов: ' . count($objects);Обработано объектов: 8