Gzputs: примеры (PHP)
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 используется для записи в обычные (несжатые) файлы. Для работы со сжатыми данными ее применяют в комбинации с потоковыми фильтрами, например, zlib.deflate. Это дает больше гибкости, но требует настройки контекста потока.
Функция file_put_contents может записывать данные в сжатый файл, если передан потоковый контекст с параметрами сжатия. Этот способ удобен для однократной записи без явного открытия/закрытия файла.
<?php
$context = stream_context_create(['gz' => ['level' => 9]]);
file_put_contents('compress.zlib://example_simple.gz', 'Текст', 0, $context);
?>Аналоги в других языках
В 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
В 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 не имеет прямой аналогии для записи в файлы .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
$gz = gzopen('large_data.gz', 'w9');
$largeDataset = range(1, 10000); // Условные данные
foreach ($largeDataset as $line) {
gzputs($gz, "Строка данных: $line\n");
}
gzclose($gz);
echo "Файл создан";
?>Файл создан
Стандартная библиотека zlib не поддерживает дозапись в существующие сжатые файлы напрямую. Для этого необходимо открыть файл для чтения, распаковать содержимое, добавить новые данные и записать все заново или использовать специальные методы.
<?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
// Создание контекста с параметрами 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);
}
?>