如何用PHP向文件追加数据(详细解答)

795 阅读5分钟

人们在创建网站时,数据通常被存储在数据库中。然而,有时我们需要将数据存储在文件中,以方便人们在以后的时间里阅读或修改。

PHP自带了很多函数来读取和写入数据到文件中。我们还可以用其中的几个函数来向文件追加数据。在本教程中,你将学习用PHP向文件追加数据的两种不同方法。

了解file_put_contents() 函数

file_put_contents()函数是用 PHP 向文件写入数据的最简单的方法之一。它接受四个不同的参数来决定其行为。这些参数是

  • filename :我们要写入数据的文件位置的路径。
  • data :指定要写到文件中的数据。它通常是一个字符串,但你也可以指定一个数组或一个流资源。该函数将自动用implode() 内爆单维数组的内容,以便将数据写到文件中。
  • flags : 控制file_put_contents() 的行为。这里有三个不同的标志,你可以单独设置,也可以与其他标志组合。不同的标志可以使用| 操作符进行组合。
  • context :只在从流中读取或访问内容时向PHP提供额外数据时有用。

使用file_put_contents() ,用PHP向文件中添加数据

函数file_put_contents() 的默认行为是用你提供的任何新数据覆盖一个给定文件的内容。当你想保留旧数据和新数据时,这是不可取的。在这种情况下,可以使用FILE_APPEND 标志来让 PHP 知道它应该在文件中原有内容的末尾追加数据。

在某些特殊情况下,可能会同时从多个脚本向一个文件追加数据。在这种情况下,建议使用LOCK_EX 标志来获得文件的独占锁。这可以帮助防止数据损坏或其他一些意外行为。当你使用这个标志时,其他脚本将等待当前进程完成对文件的写入,然后再追加自己的数据。

下面是一个例子,使用file_put_contents() ,将一些文本追加到一个现有的文件中。

<?php

// Original File: Canada is a country in North America. .... bi-national land border.

// File Contents After this Line: Canada is a country in North America. .... bi-national land border.  Canada's capital is Ottawa,
file_put_contents('canada.txt', " Canada's capital is Ottawa,",  FILE_APPEND | LOCK_EX);

// File Contents After this Line: Canada is a country in North America. .... bi-national land border.  Canada's capital is Ottawa, and its three largest metropolitan areas are Toronto, Montreal, and Vancouver.
file_put_contents('canada.txt', " and its three largest metropolitan areas are Toronto, Montreal, and Vancouver.",  FILE_APPEND | LOCK_EX);

?>

在上面的例子中,我们写了一些字符串到一个叫canada.txt的文件中,该文件包含关于加拿大的信息。两个字符串都被一个接一个地追加到了文件的末尾。

请记住,如果一个文件不存在,这个函数将创建一个文件。但是,它不会创建一个不存在的目录。因此,在你开始写文件之前,检查文件是否存在可能是一个好主意。

使用fwrite() ,用PHP将数据写入文件

使用file_put_contents() 函数将数据写到文件中,类似于调用 fopen(), fwrite()fclose()的顺序。这意味着在同一个文件上做多个写操作可能是低效的,因为我们在不断地重复打开和关闭文件。

克服这个问题的一个方法是自己调用这些函数。只要在写操作的开始时调用fopen() 。之后,用fwrite() 函数向文件写入内容,次数不限。最后,你可以简单地调用fclose() 来关闭文件句柄。现在让我们详细讨论一下这些步骤中的每一个。

fopen() 函数接受四个不同的参数,可以用来告诉 PHP 应该如何打开一个文件。

  • filename :要打开的文件的名称。
  • mode :打开文件的模式可以用一个或两个字符来指定。因为我们要打开文件,然后向其中添加一些文本。要追加,用字符aa+ 设置模式。这将把文件指针放在文件的末端。如果文件不存在,PHP也会尝试创建该文件。当用a+ 模式打开文件时,还可以读取文件的内容。
  • use_include_path : 指示 PHP 也寻找指定的包含路径内的文件。默认为false。
  • context :只在从流中读取或访问内容时向 PHP 提供额外的数据时有用。

现在文件已经打开,我们可以使用fwrite() 函数来向文件添加信息。fwrite() 需要三个参数。

  • resource :这是我们先前用fopen() 创建的资源句柄。
  • string : 你想在文件中添加的文本。
  • length : 是可选的,它用于设置应写入文件的最大字节数。

一旦你完成了所有的写操作,你可以通过使用fclose() 函数来关闭文件句柄。

下面是一个例子,告诉你如何使用fopen(),fwrite()fclose() 来追加数据到一个文件。

<?php

$square_file = fopen("squares.txt", "a+");

//output the squares from 1 to 10
for($i = 1; $i <= 10; $i++) {
    $square = $i*$i;
    $cube = $square*$i;
    $line = "Square of $i is: $square.\n";
    fwrite($square_file, $line);
}

fseek($square_file, 0)
echo fgets($square_file)

fclose($square_file);

?>

square.txt的内容

Square of 1 is: 1.
Square of 2 is: 4.
Square of 3 is: 9.
Square of 4 is: 16.
Square of 5 is: 25.
Square of 6 is: 36.
Square of 7 is: 49.
Square of 8 is: 64.
Square of 9 is: 81.
Square of 10 is: 100.

在这个例子中,我们在一个叫做square.txt 的文件中写入数字 1 到 10 的平方。我们使用fopen() 函数在a+ 模式下打开它,这意味着我们也可以从文件中读取内容,并追加我们自己的内容。在for循环的每一次迭代中,我们都会在文件中添加一行新的内容,包括$i 的当前值和它的平方。

有一些函数,如fread()fgets()你可以使用这些函数来读取文件中的任何内容。然而,你通常需要使用 fseek()将文件指针放在所需的位置上,以便按预期读取数据。循环之后,我们寻找文件的开头,用fgets() 读取它的第一行。

最后,我们通过调用函数fclose() 来关闭我们文件的句柄。

最后的思考

在本教程中,我们学习了用PHP向文件追加数据的两种不同方法。使用file_put_contents() 函数在向文件写入数据时比较方便。然而,当你必须对一个文件进行多次写操作时,使用fwrite() 可能更有效率。用fopen() 打开一个文件来追加数据,也可以选择通过移动文件指针到所需的位置来读取其内容。