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

Использование 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
// Установка include_path
ini_set('include_path', '/путь/к/директории');

// Поиск файла в include_path
$lines = gzfile('compressed.log.gz', 1);
if ($lines !== false) {
    echo 'Прочитано строк: ' . count($lines);
}
Прочитано строк: 150

Похожие функции в PHP

gzopen() и gzread()

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

file()

Аналогична gzfile(), но работает с несжатыми файлами. Используется, когда не требуется обработка сжатых данных.

gzgetcsv()

Читает строку из gzip-файла и парсит её как CSV. Полезно при работе со сжатыми CSV-данными.

file_get_contents() с оберткой zlib

Использование потока 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())
Первая строка файла
Вторая строка файла
JavaScript (Node.js)

Использование модуля 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 в gzip-файле
Пример php
// Чтение и парсинг сжатого 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
        )
)
Фильтрация строк при чтении
Пример php
// Поиск строк, содержащих определенную подстроку
$lines = gzfile('access.log.gz');
$search = 'POST /api/';
$filtered = [];

foreach ($lines as $line) {
    if (str_contains($line, $search)) {
        $filtered[] = $line;
    }
}

echo 'Найдено совпадений: ' . count($filtered);
Найдено совпадений: 42
Сравнение двух сжатых файлов
Пример php
// Сравнение содержимого двух 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
Обработка многострочных записей
Пример php
// Обработка файла с многострочными 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

PHP gzfile function comments

En
Gzfile Read entire gz-file into an array