使用 PHP 写入文件和读取文件

作者 : 慕源网 本文共4884个字,预计阅读时间需要13分钟 发布时间: 2021-09-14 共200人阅读

使用 PHP 写入文件和读取文件

在本教程中,您将学习 PHP 中的几个重要函数,它们足以满足您所有基本的文件读写需求。您将学习如何读取文件、写入文件、写入文本文件以及检查文件是否存在。

幸运的是,PHP 提供了很多函数来读取和写入文件数据。在本教程中,我将向您展示从本地或远程文件读取数据的最简单方法,以及如何使用标志以我们想要的方式写入文件。

检查文件是否存在

尝试从文件读取数据或向其中写入内容时,您的第一步应该是检查文件是否已存在。尝试从不存在的文件中读取数据将导致 PHP 发出警告,并且可能会使您的代码崩溃。

检查文件是否存在的最简单方法是使用 PHPfile_exists($filename)函数。true如果具有给定的文件或目录$filename存在,它将返回,false否则返回。这可能是显而易见的,但我想指出这 $filename不一定只是文件名。它也可以是绝对或相对路径。例如,我们可以使用 prime_numbers.txtscience/project/periodic_table.txt

同样重要的是要记住,false由于安全模式限制,此函数也将返回无法访问的文件。

另一个可用于检查文件是否存在的函数是is_file(). 与 相比file_exists(),此函数仅true在指定的路径指向文件而不是目录时才返回。

   确保文件确实存在

如果您正在编写的代码对特定文件执行大量文件操作,则使用上述函数可能会得到不正确的结果。这是因为两者的执行结果file_exists(),并is_file()以提高性能的缓存。PHP还通过缓存像其他的文件系统函数的返回值filesize()filemtime()等等。

您可以致电clearstatcache()以确保您访问的任何文件信息都是最新的。

如果在单个脚本中多次访问同一个文件以了解其状态,这通常只是一个问题。此外,如果您使用该unlink()函数删除脚本内的文件,则缓存数据将被清除。这基本上意味着您可能不会遇到任何与缓存相关的问题,但知道您可以清除缓存以防信息过时或在尝试访问有关文件的信息时获得意外结果仍然很好。

用 PHP 从文件中读取数据

在 PHP 中从文件读取数据的最简单方法之一是借助该  file_get_contents($filename, $use_include_path, $context, $offset, $maxlen)函数。它只会读取整个文件并以字符串的形式提供给您。除第一个参数外的所有参数都是可选的。

第二个参数接受一个布尔值,以确定它是否应该在包含路径指定的位置查找文件,可以使用该set_include_path()函数进行设置。

您可以使用第三个参数来指定一系列选项来优化文件的访问方式。您可以使用它来指定标头值,如CookiesHost 以及 HTTP 方法。

$offset参数确定读取原始文件的起始点。提供负值将从末尾开始计数。仅在 PHP 7.1.0 中添加了对负偏移量的支持。值得注意的是,offset 只适用于本地文件,不支持远程文件。

file_get_contents()默认情况下,该函数一次读取整个文件。您可以通过为$maxlen参数提供值来更改此行为。要读取的字符长度从偏移值开始计算。

false如果未能从您指定的文件中读取数据,则此函数将返回。但是,它也可以返回计算结果为 的值false,因此请确保使用===运算符检查它是否实际返回了 false 。

您可以使用此函数打开远程文件,但只有allow-url-fopenphp.ini中的选项值为trueor 时才有可能 1

用 PHP 将数据写入文件

在 PHP 中将数据写入文件的最简单方法之一是借助该 file_put_contents($filename, $data, $flags, $context)函数。

$filename参数确定将写入数据的文件。第二个参数是要写入文件的数据。大多数时候它是一个字符串,但它也可以是一个数组或流资源。

请记住,如果文件不存在,PHP 将自动为您创建一个具有给定名称的文件。但是,它不会为您创建任何目录。这意味着您可以存储名为On the Origin of Species [Charles Darwin].txt 的文件 而不会出现任何错误。但是,设置$filename为  Biology/Evolution/On the Origin of Species [Charles Darwin].txt,如果Biology/Evolution/不存在,将导致错误。

$flags参数确定内容将如何写入文件。它可以具有以下三个值中的任何一个或全部:

  • FILE_USE_INCLUDE_PATH——这告诉 PHP 在包含目录中搜索给定的文件名。
  • FILE_APPEND—这将告诉 PHP 将您传递给函数的数据附加到文件中的现有数据。如果您将数据存储在日志或个人日记等文件中,这可能会很有用。记录今天发生在您身上的温度或事件等新数据不会覆盖您昨天记录的内容。
  • LOCK_EX——这将告诉 PHP 在开始向文件写入内容之前锁定文件。当两个不同的脚本在同一个文件中读取或写入数据时,它可以防止意外的事情发生。使用此特定值,您将获得文件的排他锁。您可以在flock()函数的 PHP 文档中阅读有关这些锁的更多信息。

此函数返回成功和false失败时写入文件的字节数。但是,您仍然必须使用严格相等运算符来检查是否成功将内容写入文件。这是因为将 0 字节写入文件的代码仍会评估为 false。

读取和写入数据到文件

您可以前往Project Gutenberg网站并尝试使用该file_get_contents()功能下载文件  。将数据存储在字符串中后,您还可以使用该file_put_contents()函数将其简单地存储在本地文件中。以下示例将说明这一点:

<?php
 
$filename = 'http://www.gutenberg.org/cache/epub/1228/pg1228.txt';
 
$book_content = file_get_contents($filename);
file_put_contents('Biology/Evolution/On the Origin of Species [Charles Darwin].txt', $book_content, LOCK_EX);
 
?>

您可以以类似的方式保存来自维基百科等网站的网页或内容。如果您需要理解 HTML 或解析您刚刚在本地保存的 HTML 内容,您可以按照使用 DiDOM 使用 PHP 解析 HTML 之类的教程,这将帮助您自动获取链接、图像文件或任何其他此类信息从网页。

现在让我们回到本地文件。考虑这样一种情况,您有一堆文本文件,并且您想分析它们的内容以查看其中最常见的单词之类的内容。这可以使用一堆内置的 PHP 函数轻松实现。

<?php
 
$filename = 'On the Origin of Species [Charles Darwin].txt';
$book_content = file_get_contents($filename);
 
$book_content_lowercase = strtolower($book_content);
 
$individual_words = explode(' ', $book_content_lowercase);
echo "There are about ".count($individual_words)." words in the book: ".substr($filename, 0, -4).".\n";
 
$word_frequency = array_count_values($individual_words);
echo "Total number of unique words in the book are ".count($word_frequency).".\n";
echo "The word 'Elephant' occurs ".$word_frequency["elephant"]." times in the book.\n";
echo "The word 'Ant' occurs ".$word_frequency["ant"]." times in the book.\n";
 
if(isset($word_frequency["evolution"])) {
    echo "The word 'Evolution' occurs ".$word_frequency["evolution"]." times in the book.\n";
} else {
    echo "The word 'Evolution' does not occur even once in the book.\n";
}
 
arsort($word_frequency);
echo "The most used word in the book is: '".key($word_frequency)."'.\n";
 
/* Output of all the code above
 
There are about 147520 words in the book: On the Origin of Species [Charles Darwin].
Total number of unique words in the book are 22758.
The word 'Elephant' occurs 3 times in the book.
The word 'Ant' occurs 6 times in the book.
The word 'Evolution' does not occur even once in the book.
The most used word in the book is: 'the'.
?>

我们将所有文本转换为小写,并假设每个单词都在空格处中断。然后将文本转换为数组explode(),以便更轻松地分析单个单词。令人惊讶的是,在给出进化论起源的整本书中,“进化”这个词甚至没有被使用过一次。

这只是自动分析大量文本的一个例子。您可以对存储在文件中的任何类型的文本执行类似的操作。

   记录数据 FILE_APPEND

一个更有用的例子是在一小段时间内记录信息。它可能是您的日常锻炼、天气数据或您正在观察的蜂群。一旦将数据放入字符串中,您就可以轻松地将其存储在文件中,并使用FILE_APPEND带有file_put_contents().

<?php
 
$filename = "bee-colony.txt";
 
$present = date('l | jS \of F Y h:i:s A', time());
$entry = $present."\n";
 
// A pseudo function which could be replaced with something real.
$bee_information = gather_bee_data();
$entry .= "$bee_information.\n\n";
 
file_put_contents($filename, $entry, FILE_APPEND|LOCK_EX);
 
?>

类似的代码可用于将维基百科当天的精选文章每天存储在一个文件中,或者在数周或数月内跟踪新闻文章和标题。您需要做的就是编写代码来抓取数据,然后使用类似于上述代码片段的内容来存储它。像Parsing HTML With PHP Using DiDOM这样的教程可以帮助您完成抓取部分。

您可以将文本包装在一些 HTML 中,以便在浏览器中更容易阅读,而不是以纯格式编写文本。可能性是无止境。

最后的想法

在 PHP 中还有许多其他方式可以读取和写入数据到文件中。然而,file_get_contents()file_put_contents()几乎所有的满足您的基本需求,而无需增加不必要的并发症。

您可能会遇到的唯一问题file_get_contents()是您正在读取的文件非常大,例如 2GB 或更大。这是因为file_get_contents()一次将整个文件加载到内存中,并且使用如此大的文件很可能会耗尽内存。在这种情况下,您将不得不依赖于像fgets()fread()一次读取文件的一小部分这样的功能。


慕源网 » 使用 PHP 写入文件和读取文件

常见问题FAQ

程序仅供学习研究,请勿用于非法用途,不得违反国家法律,否则后果自负,一切法律责任与本站无关。
请仔细阅读以上条款再购买,拍下即代表同意条款并遵守约定,谢谢大家支持理解!

发表评论

开通VIP 享更多特权,建议使用QQ登录