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

Использование функции rewind для работы с файлами в PHP
Раздел: Работа с файлами
rewind(resource $stream): bool

Функция rewind() в PHP сбрасывает указатель позиции файлового потока в начало. Она применяется для работы с файловыми дескрипторами, открытыми функциями fopen(), fsockopen() или popen().

Назначение и применение

Основная задача функции - вернуть указатель чтения или записи в начало файлового ресурса. Это полезно при необходимости повторной обработки данных без повторного открытия файла.

Синтаксис
bool rewind ( resource $handle )

Единственный параметр $handle представляет файловый ресурс, полученный при успешном открытии файла. Функция возвращает true при успешном выполнении или false в случае ошибки.

Базовые примеры использования
Чтение файла с повторным позиционированием
<?
$file = fopen('test.txt', 'r');
echo fread($file, 5); // Читаем первые 5 символов
rewind($file); // Возвращаемся в начало
echo fread($file, 10); // Читаем первые 10 символов
fclose($file);
?>
ПервыеПервые 10 си
Работа с файлом в режиме чтения и записи
<?
$file = fopen('data.txt', 'r+');
fwrite($file, 'Новые данные');
rewind($file);
echo fgets($file); // Прочитать записанные данные
fclose($file);
?>
Новые данные
Похожие функции в PHP

fseek($handle, $offset) - устанавливает указатель в конкретную позицию. Позволяет перемещаться в любое место файла, а не только в начало.

ftell($handle) - возвращает текущую позицию указателя. Используется для определения местоположения в файле.

fread($handle, $length) - читает данные из файла с текущей позиции указателя.

Функцию rewind() предпочтительнее использовать для быстрого возврата в начало файла, в то время как fseek() обеспечивает более гибкое позиционирование.

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

Rewind в Python

# Метод seek() с параметром 0
file = open('file.txt', 'r')
file.read(5)
file.seek(0)  # Аналог rewind()
print(file.read(10))
file.close()
JavaScript (Node.js)
// Использование createReadStream с повторным созданием
const fs = require('fs');
const stream = fs.createReadStream('file.txt', {start: 0});
// Для возврата в начало обычно пересоздают поток
stream.destroy();
const newStream = fs.createReadStream('file.txt');

Rewind в MySQL

-- Курсоры в хранимых процедурах
DECLARE cur CURSOR FOR SELECT * FROM table;
OPEN cur;
-- FETCH cur INTO ...
-- Для повторного чтения нужно закрыть и снова открыть
CLOSE cur;
OPEN cur;
Типичные ошибки
Попытка использования с закрытым ресурсом
<?
$file = fopen('test.txt', 'r');
fclose($file);
rewind($file); // Ошибка: ресурс уже закрыт
?>
Warning: rewind(): supplied resource is not a valid stream resource
Работа с несуществующим файловым указателем
<?
$invalidResource = false;
rewind($invalidResource); // Некорректный аргумент
?>
Warning: rewind() expects parameter 1 to be resource, bool given
Использование с потоками, не поддерживающими позиционирование
<?
$stream = fopen('php://input', 'r');
rewind($stream); // Может не работать с некоторыми потоками
?>
Изменения в последних версиях PHP

В PHP 8.0 была изменена обработка нересурсных аргументов. Теперь при передаче значения неправильного типа генерируется исключение TypeError вместо предупреждения.

В PHP 7.4 улучшена обработка ошибок для некорректных потоков. Функция стала более строгой при проверке допустимости операции позиционирования для конкретного типа потока.

Расширенные примеры
Многократная обработка лог-файла
Пример php
<?
$logFile = fopen('application.log', 'r');

// Первый проход: подсчет строк
$lineCount = 0;
while (!feof($logFile)) {
    fgets($logFile);
    $lineCount++;
}
echo "Всего строк: $lineCount\n";

// Возврат для анализа содержимого
rewind($logFile);

// Второй проход: поиск ошибок
$errorCount = 0;
while (($line = fgets($logFile)) !== false) {
    if (strpos($line, 'ERROR') !== false) {
        $errorCount++;
    }
}
echo "Найдено ошибок: $errorCount\n";

fclose($logFile);
?>
Обработка CSV файла с разными наборами данных
Пример php
<?
$csvFile = fopen('data.csv', 'r');

// Чтение заголовков
$headers = fgetcsv($csvFile);

// Анализ данных
$data = [];
while ($row = fgetcsv($csvFile)) {
    $data[] = array_combine($headers, $row);
}

// Возврат для статистики
rewind($csvFile);
fgetcsv($csvFile); // Пропустить заголовки

$rowLengths = [];
while ($row = fgetcsv($csvFile)) {
    $rowLengths[] = count($row);
}

echo "Средняя длина строки: " . array_sum($rowLengths)/count($rowLengths);

fclose($csvFile);
?>
Работа с временным потоком в памяти
Пример php
<?
$memoryStream = fopen('php://memory', 'w+');
fwrite($memoryStream, 'Данные в памяти');
rewind($memoryStream);
echo stream_get_contents($memoryStream); // Вывод: Данные в памяти
fclose($memoryStream);
?>

PHP rewind function comments

En
Rewind Rewind the position of a file pointer