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

Функция gzgetss в PHP: примеры и альтернативы
Раздел: Сжатие
gzgetss(resource $zp, int $length, string $allowable_tags = ?): string
Функция gzgetss в PHP

Функция gzgetss была предназначена для чтения строки из gz-файла с одновременным удалением HTML и PHP тегов. Она использовалась для обработки сжатых лог-файлов, конфигурационных данных или других текстовых ресурсов, где требовалась фильтрация разметки.

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

Функция принимала три параметра:

  1. zp - Указатель на gz-файл, успешно открытый с помощью функции gzopen().
  2. length - Максимальное количество символов для чтения из файла.
  3. allowable_tags - Необязательный параметр, строка с тегами, которые не должны удаляться.
Простые примеры работы
Базовое чтение с удалением тегов

Чтение строки длиной 100 символов:

<?
$handle = gzopen('file.gz', 'r');
$string = gzgetss($handle, 100);
echo $string;
gzclose($handle);
?>
Текст без HTML тегов, которые были удалены.
С сохранением определенных тегов

Чтение с разрешением тегов <b> и <i>:

<?
$handle = gzopen('file.gz', 'r');
$string = gzgetss($handle, 200, '');
echo $string;
gzclose($handle);
?>
Текст с жирным и курсивным оформлением.
Похожие функции в PHP

После удаления gzgetss в PHP 8.0 рекомендуется использовать комбинацию других функций:

  1. gzgets() + strip_tags() - Позволяет получить тот же результат: чтение строки из gz-файла и удаление тегов.
  2. fgets() + strip_tags() с прозрачной декомпрессией - При использовании обертки 'zlib' можно работать со сжатыми файлами как с обычными.
  3. SplFileObject с фильтрацией - Объектно-ориентированный подход для обработки файлов.

Комбинация gzgets() и strip_tags() предпочтительнее, так как обеспечивает явный контроль над процессом.

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

Gzgetss в Python

Использование gzip и re модулей:

import gzip
import re

with gzip.open('file.gz', 'rt', encoding='utf-8') as f:
    line = f.readline(100)
    clean_line = re.sub(r'<[^>]*>', '', line)
    print(clean_line)
Текст без HTML тегов.
JavaScript (Node.js)

С использованием zlib и регулярных выражений:

const zlib = require('zlib');
const fs = require('fs');

const stream = fs.createReadStream('file.gz')
    .pipe(zlib.createGunzip());
let data = '';
stream.on('data', chunk => data += chunk);
stream.on('end', () => {
    const firstLine = data.split('\n')[0];
    const cleanLine = firstLine.replace(/<[^>]*>/g, '');
    console.log(cleanLine);
});

Gzgetss в MySQL

Чтение сжатого файла средствами СУБД не предусмотрено, требуется предварительная распаковка.

Типичные ошибки
Использование после удаления в PHP 8

Вызов функции приводит к фатальной ошибке:

<?
$handle = gzopen('file.gz', 'r');
$string = gzgetss($handle, 100); // Фатальная ошибка
?>
Fatal error: Uncaught Error: Call to undefined function gzgetss()
Некорректный указатель файла

Передача нересурса в первый аргумент:

<?
$string = gzgetss('not_a_resource', 100);
?>
Warning: gzgetss() expects parameter 1 to be resource, string given
Чтение после закрытия файла

Попытка чтения из закрытого дескриптора:

<?
$handle = gzopen('file.gz', 'r');
gzclose($handle);
$string = gzgetss($handle, 100);
?>
Warning: gzgetss(): supplied resource is not a valid stream resource
История изменений

Функция gzgetss претерпела значительные изменения:

  1. PHP 4.3.0 - Добавлен необязательный параметр allowable_tags.
  2. PHP 7.0.0 - Функция объявлена устаревшей (deprecated).
  3. PHP 8.0.0 - Функция полностью удалена из языка. Все вызовы вызывают фатальную ошибку.

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

Расширенные сценарии
Обработка многострочных файлов

Построчное чтение всего файла с фильтрацией:

Пример php
<?
$handle = gzopen('logs.gz', 'r');
$cleanLines = [];
while (!gzeof($handle)) {
    $line = gzgetss($handle, 1024, '
'); if ($line !== false) { $cleanLines[] = trim($line); } } gzclose($handle); print_r($cleanLines); ?>
Array
(
    [0] => Лог-сообщение без тегов
    [1] => Сообщение с 
переносом строки )
Контекстная фильтрация с сохранением ссылок

Обработка HTML-контента с сохранением только безопасных тегов:

Пример php
<?
$handle = gzopen('content.gz', 'r');
$allowed = '';
$content = '';
while (!gzeof($handle)) {
    $content .= gzgetss($handle, 512, $allowed);
}
gzclose($handle);
echo $content;
?>
Текст с выделением и ссылкой.
Обработка с проверкой кодировки

Чтение с предварительной проверкой и конвертацией:

Пример php
<?
$handle = gzopen('win1251.gz', 'r');
$string = gzgetss($handle, 500);
if (mb_detect_encoding($string, 'UTF-8, Windows-1251') != 'UTF-8') {
    $string = iconv('Windows-1251', 'UTF-8', $string);
}
echo $string;
gzclose($handle);
?>
Текст в корректной UTF-8 кодировке.

PHP gzgetss function comments

En
Gzgetss Get line from gz-file pointer and strip HTML tags