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

Использование gzputs для записи в сжатые файлы
Раздел: Сжатие
gzputs(resource $stream, string $data, ?int $length = null): int|false

Функция gzputs в PHP

Описание и назначение

Функция gzputs в PHP является псевдонимом для функции gzwrite. Она предназначена для записи данных в файл, сжатый с использованием алгоритма gzip. Основное применение — работа со сжатыми файлами в формате .gz, что полезно для экономии дискового пространства при хранении больших объемов текстовых данных, логирования или создания резервных копий.

Аргументы функции

Функция принимает следующие параметры:

  • $stream (resource) — обязательный параметр. Указатель (ресурс) на файл, полученный с помощью функции gzopen.
  • $data (string) — обязательный параметр. Строка с данными, которые необходимо записать в сжатый файл.
  • $length (int) — необязательный параметр. Если указан, запись остановится после того, как будет записано указанное количество байт. Если параметр не задан, будет записана вся строка.

Функция возвращает количество записанных байт в случае успеха или FALSE в случае возникновения ошибки.

Примеры использования gzputs

Базовый пример записи строки
<?php
$gz = gzopen('example.gz', 'w9');
if ($gz) {
    $bytes_written = gzputs($gz, 'Пример текста для сжатия.');
    echo "Записано байт: $bytes_written";
    gzclose($gz);
} else {
    echo "Ошибка открытия файла";
}
?>
Записано байт: 27
Использование параметра длины записи
<?php
$gz = gzopen('partial.gz', 'w');
if ($gz) {
    // Запишем только первые 11 байт строки
    $result = gzputs($gz, 'Длинная строка для примера', 11);
    echo "Записано байт: $result";
    gzclose($gz);
}
?>
Записано байт: 11

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

Функция gzwrite является полным аналогом gzputs и ведет себя идентично. Выбор между ними — вопрос стиля кода.

fwrite

Функция fwrite используется для записи в обычные (несжатые) файлы. Для работы со сжатыми данными ее применяют в комбинации с потоковыми фильтрами, например, zlib.deflate. Это дает больше гибкости, но требует настройки контекста потока.

file_put_contents с флагом сжатия

Функция file_put_contents может записывать данные в сжатый файл, если передан потоковый контекст с параметрами сжатия. Этот способ удобен для однократной записи без явного открытия/закрытия файла.

<?php
$context = stream_context_create(['gz' => ['level' => 9]]);
file_put_contents('compress.zlib://example_simple.gz', 'Текст', 0, $context);
?>

Аналоги в других языках

Python (модуль gzip)

В Python используется модуль gzip. Запись производится методами write или writelines объекта GzipFile. Отличие — более объектно-ориентированный интерфейс.

import gzip
with gzip.open('example_py.gz', 'wt', compresslevel=9) as f:
    bytes_written = f.write('Пример текста')
    print(f'Записано символов: {bytes_written}')
Записано символов: 13
JavaScript (Node.js, модуль zlib)

В Node.js сжатие и запись в файл требуют использования модулей zlib и fs и работы с потоками (Streams). Процесс асинхронный.

const zlib = require('zlib');
const fs = require('fs');
const gzip = zlib.createGzip({ level: 9 });
const input = 'Текст для сжатия';
const output = fs.createWriteStream('example.js.gz');
gzip.write(input);
gzip.end();
gzip.pipe(output);
MySQL (компрессия на уровне протокола)

MySQL не имеет прямой аналогии для записи в файлы .gz, но поддерживает сжатие соединения между клиентом и сервером с помощью параметра --compress или функции COMPRESS() для сжатия данных в столбцах.

Типичные ошибки

Передача неверного ресурса файла

Если переданный ресурс не был получен с помощью gzopen, функция вернет ошибку.

<?php
$fp = fopen('regular.txt', 'w');
$result = @gzputs($fp, 'текст'); // Используем @ для подавления предупреждения
var_dump($result);
?>
bool(false)
Попытка записи в файл, открытый только для чтения

Если файл был открыт с режимом, не поддерживающим запись (например, 'r'), функция завершится с ошибкой.

<?php
$gz = gzopen('readonly.gz', 'r');
$result = @gzputs($gz, 'текст');
var_dump($result);
gzclose($gz);
?>
bool(false)
Указание длины, превышающей размер строки

Если параметр $length больше длины строки $data, будет записана вся строка, ошибки не произойдет. Однако, указание отрицательного значения может привести к непредсказуемому поведению.

Изменения в версиях PHP

Функция gzputs является долгожителем в PHP и сохраняет стабильное поведение. В PHP 8.0 не было внесено изменений, специфичных для этой функции. Однако, стоит отметить общее изменение: в PHP 8.0 многие функции, включая родственные gzwrite, стали более строгими к типам передаваемых аргументов. Это косвенно влияет и на gzputs, так как она является ее псевдонимом. Передача аргументов неверного типа теперь чаще вызывает TypeError вместо предупреждений.

Расширенные примеры

Построчная запись большого массива данных

Эффективная запись большого объема данных с построчным добавлением и контролем использования памяти.

Пример php
<?php
$gz = gzopen('large_data.gz', 'w9');
$largeDataset = range(1, 10000); // Условные данные
foreach ($largeDataset as $line) {
    gzputs($gz, "Строка данных: $line\n");
}
gzclose($gz);
echo "Файл создан";
?>
Файл создан
Дозапись в существующий gzip-файл

Стандартная библиотека zlib не поддерживает дозапись в существующие сжатые файлы напрямую. Для этого необходимо открыть файл для чтения, распаковать содержимое, добавить новые данные и записать все заново или использовать специальные методы.

Пример php
<?php
$filename = 'append.gz';
$oldContent = '';
if (file_exists($filename)) {
    $oldContent = gzdecode(file_get_contents($filename));
}
$newContent = $oldContent . "\nНовая запись";
file_put_contents('compress.zlib://' . $filename, $newContent);
?>
Использование с потоковыми контекстами

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

Пример php
<?php
// Создание контекста с параметрами gzip
$params = ['level' => 6, 'window' => 15, 'memory' => 9];
$context = stream_context_create(['gz' => $params]);
// Открытие файла с использованием контекста (альтернативный способ)
$gz = gzopen('compress.zlib://file_via_context.gz', 'w', false, $context);
if ($gz) {
    gzputs($gz, "Данные, сжатые с кастомными параметрами");
    gzclose($gz);
}
?>

PHP gzputs function comments

En
Gzputs Alias of gzwrite