如何使用PHP读取文件的6种方法

总结了用PHP读取文件的方法。

试着用6种方法读入文件。

  • file函数

  • readfile函数

  • file_get_contents函数

  • SplFileObject类

  • fread函数

  • fgets函数

用file函数读取文件

尝试使用file函数读取文件内容。

用file函数读取的话,读取的文件会作为数组返回。

<?php
$contents = file("hello.txt");

foreach ($contents as $number => $content) {
    $fileNumber = $number + 1;
    echo "{$fileNumber}: " . $content;
}

使用file函数读取了文件。

传递给file函数的是文件的路径。

将文件的路径传递给对方,对方会读取文件并将其排列后返回。(换行的时候就这样。)

返回的文件的内容的排列用foreach语句旋转显示。

$number变量是数组的关键。因为有从0开始的值,所以作为行号使用。

$content变量会一行一行地输入读取的文件内容。

因为$number变量是从0开始的,所以加上1,作为从1开始的行号。

这次我们读取的是本地的文件,也可以指定URL使用Web上的文件。

操作检查

如下准备文件并检查操作。

测试PHP文件读取
导入文本文件
Hello, World!

然后输出就像这样带有行号。

我能够确认它是逐行读取的。

1: 测试PHP文件读取
2: 导入文本文件
3: Hello, World!

如何使用PHP读取文件的6种方法

使用 readfile 函数读取

使用 readfile 函数读取文件的内容。

readfile 函数是一个读取文件并立即将其写入标准输出的函数。

<?php
readfile("hello.txt");

执行时,文件的内容被写入标准输出。

如果你在控制台运行它,文件的内容将原样输出到控制台。

readfile 函数用于在网络上下载文件。

如果你这样写,你访问PHP文件的时候就可以下载任何文件了。

这次,我尝试下载图像文件“test.png”文件。

<?php
$image = 'test.png';

header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header("Cache-Control: no-cache, must-revalidate");
header("Expires: 0");
header('Content-Disposition: attachment; filename="'.basename($image).'"');
header('Content-Length: ' . filesize($image));
header('Pragma: public');

readfile($image);

使用 file_get_contents 函数读取

尝试使用 file_get_contents 函数读取文件的内容。

file_get_contents 函数读取文件并将其作为字符串返回。

<?php
$contents = file_get_contents("hello.txt");
var_dump($contents);

传递的文件路径的内容作为字符串返回到 $contents 变量。

我使用 var_dump 函数输出 $contents 变量的内容。

这次我指定了一个本地文件路径,但您也可以指定一个 URL。

操作检查

如下准备文件并检查操作。

测试PHP文件读取
导入文本文件
Hello, World!

然后,我可以确认字符串是这样返回的。

string(56) "测试PHP文件读取 导入文本文件 Hello, World!"

使用 SplFileObject 类读取

尝试使用 SplFileObject 类读取文件的内容。如果您指定

SplFileObject 类的文件路径,它将返回一个文件对象。

<?php
$file = new SplFileObject("hello.txt");

foreach ($file as $number => $content) {
    $fileNumber = $number + 1;
    echo "{$fileNumber}: " . $content;
}

当您新建 SplFileObject 时,将文件路径传递给构造函数。

这将返回一个文件对象。

我们正在接收 $file 变量中返回的文件对象。

通过将它传递给 foreach 语句,它可以像数组一样使用。

由于 $number 变量存储了一个从 0 开始的数字,它将被用作行号。

$content 变量逐行包含加载文件的内容。

SplFileObject 类还可以使用 setFlags 方法跳过空行。

还有读取CSV文件的设置,所以我觉得读取CSV文件的时候用这个类会很好。

操作检查

如下准备文件并检查操作。

测试PHP文件读取
导入文本文件
Hello, World!

然后结果类似于文件功能。

我能够确认它是逐行读取的。

1: 测试PHP文件读取
2: 导入文本文件
3: Hello, World!

使用 fread 函数读取

使用 fread 函数读取文件。

通过fopen函数访问文件后即可使用。以字符串的形式获取文件的内容。

<?php
$filePath = "hello.txt";
$handle = fopen($filePath, "r");

$contents = fread($handle, filesize($filePath));
var_dump($contents);

fclose($handle);

首先,在 $filePath 变量中指定要读取的文件路径。

我正在使用 fopen 函数打开文件。

文件路径作为第一个参数传递,模式设置为第二个参数。

由于为模式设置了“r”,因此将读取它。

由于返回了文件的资源类型,因此它存储在 $handle 变量中。

在接下来的过程中,使用 fread 函数读取文件的内容。

第一个参数指定先前获得的资源类型的 $handle 变量。

第二个参数指定要读取的文件的大小。它是通过将文件路径传递给 filesize 函数获得的。

加载文件的内容在 $contents 变量中接收。

var_dump 函数输出变量的内容。

最后,使用 fclose 关闭文件以结束进程。

您传递的是打开文件的资源。

操作检查

如下准备文件并检查操作。

测试PHP文件读取
导入文本文件
Hello, World!

这将给出与 file_get_contents 函数类似的结果。

确认可以以字符串形式获取文件内容。

string(56) "测试PHP文件读取 导入文本文件 Hello, World!"

使用 fgets 函数读取

使用 fgets 函数读取文件。

这也在使用 fopen 函数访问文件后使用。

通过使用 fgets 函数,可以像文件函数一样读取和处理每一行。

<?php
$filePath = "hello.txt";

$handle = fopen($filePath, "r");
$number = 1;
while ($line = fgets($handle)) {
    echo "第{$number}行: " . $line;
    $number += 1;
}

fclose($handle);

首先,在 $filePath 变量中指定要读取的文件路径。

我正在使用 fopen 函数打开文件。

文件路径作为第一个参数传递,模式设置为第二个参数。

$handle 将返回文件资源。

在下一行中,我们提供了一个 $number 变量用于行号。

我正在使用 while 语句逐行读取文件的内容。

我们传递给 fgets 函数的是我们得到的资源类型的 $handle 变量。

我们将文件的内容逐行存储在 $line 变量中,直到文件的内容被读取。

在循环处理中,我打印出了文件的行号和内容。

最后,fclose 关闭文件并终止进程。

操作检查

如下准备文件并检查操作。

测试PHP文件读取
导入文本文件
Hello, World!

这样的话,就会得到和file函数相同的结果。

一行一行地处理,连同行号一起输出文件的内容。

第1行: 测试PHP文件读取 
第2行: 导入文本文件 
第3行: Hello, World!

6种文件读取方式总结

下表总结了本次介绍的文件读取方式。

函数/类内容
file逐行读取文件
readfile读取文件并立即写入标准输出
file_get_contents将整个文件作为字符串读取
SplFileObject使用类,以行为单位读取
fread使用fopen函数获取的资源,用字符串读取文件
fgets使用fopen函数获取的资源,以行为单位读取文件

如果想方便阅读,用file_get_contents函数和file函数好像也不错。

当以字符串形式批量读取时,我使用了 file_get_contents 函数,而当以行为单位读取时,我使用了file函数。

让我们在下载过程中使用 readfile 函数。

最后编辑于:2023/03/11作者: 烽烟无限