PHP fpassthru 函数
最后修改于 2025 年 4 月 3 日
PHP fpassthru 函数输出文件指针中剩余的所有数据。它对于将大文件直接流式传输到输出非常有效。
基本定义
fpassthru 函数从文件中的当前位置读取数据直到文件末尾 (EOF),并将数据写入输出缓冲区。它返回读取的字节数。
语法:fpassthru(resource $stream): int。该函数对二进制文件很有用,并且需要一个已打开的文件指针。
fpassthru 基本示例
这显示了 fpassthru 输出文件的最简单用法。
basic_fpassthru.php
<?php
declare(strict_types=1);
$file = fopen('example.txt', 'rb');
if ($file) {
fpassthru($file);
fclose($file);
}
这将读取并输出 example.txt 的全部内容。文件以二进制模式打开,以便在不同平台之间可靠地读取。
输出图片文件
fpassthru 常用于输出图片等二进制文件。
image_output.php
<?php
declare(strict_types=1);
$imagePath = 'photo.jpg';
$file = fopen($imagePath, 'rb');
if ($file) {
header('Content-Type: image/jpeg');
fpassthru($file);
fclose($file);
exit;
}
此示例将 JPEG 图片直接流式传输到浏览器。在调用 fpassthru 处理二进制数据之前,必须设置正确的标头。
部分文件输出
您可以将 fseek 与 fpassthru 结合使用以实现部分输出。
partial_output.php
<?php
declare(strict_types=1);
$file = fopen('largefile.bin', 'rb');
if ($file) {
fseek($file, 1024); // Skip first 1KB
$bytes = fpassthru($file);
echo "Output $bytes bytes";
fclose($file);
}
这将跳过文件的前 1KB,然后再输出其余部分。该函数返回输出的字节数,这对于日志记录可能很有用。
PDF 文件下载
fpassthru 可以通过设置正确的标头来强制下载文件。
pdf_download.php
<?php
declare(strict_types=1);
$pdfFile = 'document.pdf';
$file = fopen($pdfFile, 'rb');
if ($file) {
header('Content-Type: application/pdf');
header('Content-Disposition: attachment; filename="downloaded.pdf"');
fpassthru($file);
fclose($file);
exit;
}
这将强制在浏览器中下载 PDF 文件。Content-Disposition 标头会告诉浏览器保存而不是显示文件。
错误处理
与文件操作一起工作时,适当的错误处理非常重要。
error_handling.php
<?php
declare(strict_types=1);
$filePath = 'data.txt';
if (!file_exists($filePath)) {
die("File not found");
}
$file = fopen($filePath, 'rb');
if (!$file) {
die("Failed to open file");
}
if (fpassthru($file) === false) {
die("Error reading file");
}
fclose($file);
此示例包括对文件存在性、打开和读取的基本错误检查。在处理文件时,请始终验证操作。
最佳实践
- 关闭文件:使用 fpassthru 后,请始终关闭文件。
- 二进制模式:使用 'rb' 模式进行可靠的二进制读取。
- 先设置标头:在调用 fpassthru 之前设置输出标头。
- 内存效率:用于大文件,以避免内存问题。
- 安全: 验证文件路径以防止目录遍历。
来源
本教程通过实际示例介绍了 PHP fpassthru 函数,展示了其在高效文件输出方面的用法。
作者
列出 所有 PHP 文件系统函数。