PHP rewind 函数
最后修改于 2025 年 4 月 3 日
PHP 的 rewind
函数将文件指针重置到文件的开头。当您需要多次读取文件或在操作后重置位置时,它至关重要。
基本定义
rewind
函数将文件指针的文件位置指示器设置为文件流的开头。它接受一个参数:文件指针资源。
语法:rewind(resource $stream): bool
。该函数在成功时返回 true,失败时返回 false。它适用于使用 fopen
打开的文件。
基本 rewind 示例
这展示了使用 rewind
重置文件指针的最简单用法。
basic_rewind.php
<?php declare(strict_types=1); $file = fopen('example.txt', 'r'); fread($file, 10); // Read first 10 bytes rewind($file); // Reset to beginning $content = fread($file, filesize('example.txt')); echo $content; fclose($file);
这段代码读取 10 个字节,倒回到开始,然后读取整个文件。如果没有 rewind,第二次读取将从第 10 个字节开始。使用后务必关闭文件。
写入后使用 rewind
在写入后使用 rewind 可以立即读取已写入的内容。
rewind_after_write.php
<?php declare(strict_types=1); $file = fopen('temp.txt', 'w+'); fwrite($file, "Hello World"); rewind($file); $content = fread($file, filesize('temp.txt')); echo $content; // Outputs: Hello World fclose($file); unlink('temp.txt');
我们写入一个文件,倒回到开始,然后读取我们写入的内容。'w+' 模式允许读写操作。应清理临时文件。
使用 CSV 文件进行 rewind
在不重新打开的情况下,rewind 有助于多次处理 CSV 文件。
rewind_csv.php
<?php declare(strict_types=1); $file = fopen('data.csv', 'r'); // First pass: count lines $lineCount = 0; while (!feof($file)) { fgetcsv($file); $lineCount++; } rewind($file); // Second pass: process data while (($data = fgetcsv($file)) !== false) { print_r($data); } fclose($file);
这段代码计算行数,倒回,然后处理 CSV 数据。如果没有 rewind,第二个循环将不会运行,因为指针将位于 EOF。CSV 处理通常需要多次遍历。
在大文件处理中使用 rewind
Rewind 能够有效地分块处理大文件。
large_file.php
<?php declare(strict_types=1); $file = fopen('large.log', 'r'); $chunkSize = 1024; // 1KB chunks // Process first chunk $chunk1 = fread($file, $chunkSize); processChunk($chunk1); rewind($file); // Process first chunk again differently $chunk1a = fread($file, $chunkSize); processChunkDifferently($chunk1a); fclose($file); function processChunk(string $data): void { echo "Processing chunk: " . strlen($data) . " bytes\n"; } function processChunkDifferently(string $data): void { echo "Alternative processing: " . strlen($data) . " bytes\n"; }
这演示了以多种方式处理相同块,而无需重新打开。对于大文件,Rewind 比关闭/重新打开更有效。分块处理可以节省大文件的内存。
使用自定义流包装器进行 rewind
Rewind 适用于实现 seek 功能的自定义流包装器。
stream_wrapper.php
<?php declare(strict_types=1); class MemoryStream { private $position = 0; private $data = ''; public function stream_open(string $path, string $mode, int $options, ?string &$opened_path): bool { return true; } public function stream_read(int $count): string|false { $ret = substr($this->data, $this->position, $count); $this->position += strlen($ret); return $ret; } public function stream_write(string $data): int { $this->data .= $data; return strlen($data); } public function stream_tell(): int { return $this->position; } public function stream_eof(): bool { return $this->position >= strlen($this->data); } public function stream_seek(int $offset, int $whence): bool { switch ($whence) { case SEEK_SET: $this->position = $offset; return true; case SEEK_CUR: $this->position += $offset; return true; case SEEK_END: $this->position = strlen($this->data) + $offset; return true; default: return false; } } } stream_wrapper_register('memory', 'MemoryStream'); $file = fopen('memory://test', 'w+'); fwrite($file, "Test data"); rewind($file); echo fread($file, 4); // Outputs: Test fclose($file);
此自定义流包装器演示了 rewind 实现。 stream_seek
方法启用了 rewind 功能。自定义包装器必须实现 seek 以支持 rewind。
最佳实践
- 错误处理: 检查 rewind 返回值以确定是否成功。
- 资源管理: 始终在使用后关闭文件。
- 位置感知: 了解您的文件指针位置。
- 模式兼容性: 确保文件模式支持定位。
来源
本教程涵盖了 PHP 的 rewind
函数,并提供了实际示例,展示了它在不同文件处理场景中的用法。
作者
列出 所有 PHP 文件系统函数。