PHP readfile 函数
最后修改于 2025 年 4 月 3 日
PHP readfile 函数读取一个文件并将其写入输出缓冲区。它对于文件下载和直接提供静态文件非常有效。
基本定义
readfile 函数读取一个文件并将其写入输出缓冲区。它返回读取的字节数,或在失败时返回 false。
语法: readfile(string $filename, bool $use_include_path = false, resource $context = ?): int|false。该函数是二进制安全的。
基本的 readfile 示例
这展示了 readfile 输出文件内容的最简单用法。
basic_readfile.php
<?php declare(strict_types=1); $file = "example.txt"; $bytes = readfile($file); echo "\nRead $bytes bytes";
这会读取 "example.txt" 并输出其内容。该函数返回读取的字节数,我们将其显示在文件内容之后。
文件下载示例
readfile 通常用于带有正确标头的下载文件。
file_download.php
<?php
declare(strict_types=1);
$file = "document.pdf";
header("Content-Type: application/pdf");
header("Content-Disposition: attachment; filename=\"" . basename($file) . "\"");
readfile($file);
exit;
这会将 PDF 文件作为下载发送,并附带适当的标头。浏览器将提示用户保存文件而不是显示它。
检查文件是否存在
在尝试读取文件之前检查文件是否存在是一个好习惯。
file_exists.php
<?php
declare(strict_types=1);
$file = "data.txt";
if (file_exists($file)) {
readfile($file);
} else {
echo "File not found";
}
这会先检查文件是否存在,如果文件丢失则可以防止警告。file_exists 函数用于此检查。
使用 include_path
第二个参数允许在 include path 中搜索文件。
include_path.php
<?php
declare(strict_types=1);
$file = "config.ini";
$bytes = readfile($file, true);
if ($bytes === false) {
echo "Failed to read file";
}
当为 true 时,第二个参数会使 PHP 在 include path 中搜索文件。这对于可能位于不同位置的文件很有用。
Stream Context 示例
第三个参数允许使用自定义流上下文进行特殊操作。
stream_context.php
<?php
declare(strict_types=1);
$context = stream_context_create([
"http" => [
"method" => "GET",
"header" => "Accept-language: en\r\n"
]
]);
$file = "http://example.com/data.txt";
$bytes = readfile($file, false, $context);
if ($bytes !== false) {
echo "\nSuccessfully read $bytes bytes";
}
这演示了使用自定义 HTTP 标头读取远程文件。流上下文会修改文件的访问方式,添加语言偏好。
最佳实践
- 安全: 验证文件路径以防止目录遍历。
- 内存: 用于大文件,因为它不会将整个文件加载到内存中。
- 标头: 设置适当的 Content-Type 以便正确处理。
- 错误处理: 始终检查返回值以确保没有错误。
- 权限: 确保 PHP 对目标文件具有读取权限。
来源
本教程通过实用的示例展示了 PHP readfile 函数在不同场景下的用法。
作者
列出 所有 PHP 文件系统函数。