Gztell: примеры (PHP)
gztell(resource $stream): int|falseФункция gztell возвращает текущую позицию указателя чтения/записи в файле, сжатом с помощью gzip. Она используется при работе с gz-файлами, открытыми функциями gzopen, gzfile или аналогичными, когда требуется узнать, на каком байте от начала файла находится указатель.
Функция принимает единственный обязательный аргумент:
- $stream (ресурс) — указатель на gz-файл, который должен быть корректно открыт с помощью
gzopen().
Возвращает целое число (int) — текущую позицию указателя в файле или false в случае ошибки.
$gz = gzopen('example.gz', 'r');
gzread($gz, 100); // Читаем 100 байт
echo gztell($gz); // Указатель теперь на 100-м байте100
$gz = gzopen('example.gz', 'r');
echo gztell($gz);0
Для работы с несжатыми файлами существует функция ftell(), которая выполняет аналогичную задачу. Она работает с обычными файловыми указателями, возвращая позицию в них.
Основное отличие: ftell() предназначена для обычных файлов, а gztell() — для файлов, сжатых gzip. При работе со сжатыми потоками следует использовать gztell().
Gztell в Python
В Python модуль gzip предоставляет метод tell() для объекта файла.
import gzip
with gzip.open('file.gz', 'rb') as f:
f.read(10)
print(f.tell())10
В Node.js можно использовать метод tell() из модуля zlib при работе с потоками, хотя прямой аналог может отсутствовать. Чаще позиция отслеживается вручную через длину данных.
Gztell в MySQL
Прямого аналога для работы со сжатыми файлами на уровне функций СУБД нет. Сжатие обычно осуществляется на уровне таблиц или столбцов.
$result = gztell('not_a_resource');
var_dump($result);Warning: gztell() expects parameter 1 to be resource, string given bool(false)
$gz = gzopen('test.gz', 'r');
gzclose($gz);
echo gztell($gz);Warning: gztell(): supplied resource is not a valid stream resource
Начиная с PHP 8.0.0, при передаче некорректного количества аргументов функция выбрасывает исключение ArgumentCountError. Ранее вызывалось предупреждение и возвращалось false.
В PHP 8.0.0 также изменён тип возвращаемого значения: ранее он мог быть int или false, теперь — строго int или false.
$gz = gzopen('large_file.gz', 'r');
$fileSize = filesize('large_file.gz'); // Приблизительный размер
while (!gzeof($gz)) {
$chunk = gzread($gz, 1024);
$position = gztell($gz);
$progress = round(($position / $fileSize) * 100, 2);
echo "Прогресс чтения: {$progress}% (позиция: {$position})\n";
}
gzclose($gz);Прогресс чтения: 10.5% (позиция: 10752) Прогресс чтения: 21.0% (позиция: 21504) ...
$gz = gzopen('data.gz', 'r');
gzseek($gz, 50); // Перемещаем указатель на 50-й байт
echo "Позиция после seek: " . gztell($gz) . "\n";
gzread($gz, 10);
echo "Позиция после чтения: " . gztell($gz);Позиция после seek: 50 Позиция после чтения: 60
$gz = @gzopen('non_existent.gz', 'r');
if ($gz === false) {
echo "Не удалось открыть файл.\n";
} else {
$pos = gztell($gz);
if ($pos === false) {
echo "Ошибка получения позиции.\n";
} else {
echo "Текущая позиция: $pos\n";
}
}Не удалось открыть файл.