PHP读取文件方法:fopen,fclose,feof,fgets,fgetss,fscanf
传统方法 例子1:
("myfile","r");
while(!feof($file_handle)){
$line=fgets($file_handle);
echo $line;
}
fclose($file_handle);
步骤:
1、打开文件,$file_handle存储一个对文件本身引用。
2、判断是否已到达文件末尾。
3、继续读取文件,直到末尾,边读边打印。
4、关闭文件。
fopen
将创建与文件链接,之所以说是创建,因为除打开文件外,fopen还可以打开URL连接
$fh=fopen(,"rb");
rb读取二进制文件,实现跨平台兼容性。
feof
feof命令将检测是否已经读到文件的末尾并返回TRUE OR FALSE。
fclose
fclose与fopen相反,它将关闭指向文件或URL的连接。
fgets
核心程序,实际读取文件。它将读取一行数据作为字符串返回。如果决定限制处理数据块大小,可以加以限制,可以添加一个参数到fgets中,限制最大行数据长度。
fgets("$file_handle","81");
回想C中"\0"字符结尾,设置参数比实际参数大一。
fread
fgets是多个文件读取函数中唯一一个可用的,它是一个更常用函数,因为续行解析会有意义。事实上其他函数也有这功能,但不是续行解析。
这时候需要用到fread,fread和fgets处理目标策略不同,更趋向二进制中读取信息(并非人类能读懂文本),由于行与二进制无关,所以必须规定读取的字节数。
$fh=fopen("myfile","rb");
$data=fread($fh,4096);
以上代码将读取4K数据,注:不管指定多少字节数,fread只会读取不超过8K字节数,假定文件没有超过8K,则可以将整个文件读入一个字符串
$fh = fopen("myfile", "rb");
$data=fread($fh,filesize("myfile"));
fclose($fh);
如果长度大于这个值,只能循环将其余内容读入。
fscanf
回到字符串处理,fscanf同样遵守传统C库文件函数,如果不熟悉,fscanf把数据读入变量。
list($filed1,$filed2,$filed3)=fscanf($fh,"%","%","%");
fgetss
fgetss为了你更好理解PHP,它的功能类似fgets,但去除HTML和PHP,只剩下纯文本。
fpassthru 函数 无论怎样读取文件,您都可以使用 fpassthru 将其余数据转储到标准输出通道。
非线性文件处理:跳跃访问
当然,以上函数只允许顺序读取文件。更复杂的文件可能要求您来回跳转到文件的不同部分。这时就用得着 fseek 了。- fseek($fh, 0);
以上示例将跳转回文件的开头。如果不需要完全返回 —— 我们可设定返回千字节 —— 然后就可以这样写:
- fseek($fh, 1024);
从 PHP V4.0 开始,您有一些其他选项。例如,如果需要从当前位置向前跳转 100 个字节,则可以尝试使用:
- fseek($fh, 100, SEEK_CUR);
类似地,可以使用以下代码向后跳转 100 个字节:
- fseek($fh, -100, SEEK_CUR);
如果需要向后跳转至文件末尾前 100 个字节处,则应使用 SEEK_END。
- fseek($fh, -100, SEEK_END);
在到达新位置后,可以使用 fgets、fscanf 或任何其他方法读取数据。
注:不能将 fseek 用于引用 URL 的文件处理。提取整个文件
现在,我们将接触到一些 PHP 的更独特的文件处理功能:用一两行处理大块数据。例如,如何提取文件并在 Web 页面上显示其全部内容?好的,您看到了 fgets 使用循环的示例。但是如何能够使此过程变得更简单?用 fgetcontents 会使过程超级简单,该方法将把整个文件放入一个字符串中。- $my_file = file_get_contents("myfilename");
- echo $my_file;
虽然它不是最好的做法,但是可以将此命令更简明地写为:
- echo file_get_contents("myfilename");
本文主要介绍的是如何处理本地文件,但是值得注意的是您还可以用这些函数提取、回显和解析其他 Web 页面。
- echo file_get_contents("http://127.0.0.1/");
此命令等效于:
- $fh = fopen("http://127.0.0.1/", "r");
- fpassthru($fh);
您一定会查看此命令并认为:“那还是太费力”。PHP 开发人员同意您的看法。因此可以将以上命令缩短为:
- readfile("http://127.0.0.1/");
readfile 函数将把文件或 Web 页面的全部内容转储到默认的输出缓冲区。默认情况下,如果失败,此命令将打印错误消息。要避免此行为(如果需要),请尝试:
- @readfile("http://127.0.0.1/");
当然,如果确实需要解析文件,则 file_get_contents 返回的单个字符串可能有些让人吃不消。您的第一反应可能是用 split() 函数将它分解一下。
- $array = split("\n", file_get_contents("myfile"));
但是既然已经有一个很好的函数为您执行此操作为什么还要这样大费周章?PHP 的 file() 函数一步即可完成此操作:它将返回分为若干行的字符串数组。
- $array = file("myfile");
应当注意的是,以上两个示例有一点细微差别。虽然 split 命令将删除新行,但是当使用 file 命令(与 fgets 命令一样)时,新行仍将被附加到数组中的字符串上。
但是,PHP 的力量还远不止于此。您可以在一条命令中使用 parse_ini_file 解析整个 PHP 样式的 .ini 文件。parse_ini_file 命令接受类似清单 4 所示的文件。清单 4. 样例 .ini 文件- ; Comment
- [personal information]
- name = "King Arthur"
- quest = To seek the holy grail
- favorite color = Blue
- [more stuff]
- Samuel Clemens = Mark Twain
- Caryn Johnson = Whoopi Goldberg
以下命令将把此文件转储为数组,然后打印该数组:
- $file_array = parse_ini_file("holy_grail.ini");
- print_r $file_array;
以下输出的是结果:
Listing 5. 输出- Array
- (
- [name] => King Arthur
- [quest] => To seek the Holy Grail
- [favorite color] => Blue
- [Samuel Clemens] => Mark Twain
- [Caryn Johnson] => Whoopi Goldberg
- )
当然,您可能注意到此命令合并了各个部分。这是默认行为,但是您可以通过将第二个参数传递给 parse_ini_file 轻松地修正它:process_sections,这是一个布尔型变量。将 process_sections 设为 True。
- $file_array = parse_ini_file("holy_grail.ini", true);
- print_r $file_array;
并且您将获得以下输出:
清单 6. 输出- Array
- (
- [personal information] => Array
- (
- [name] => King Arthur
- [quest] => To seek the Holy Grail
- [favorite color] => Blue
- )
- [more stuff] => Array
- (
- [Samuel Clemens] => Mark Twain
- [Caryn Johnson] => Whoopi Goldberg
- )
- )
PHP 将把数据放入可以轻松解析的多维数组中。
最佳实践绝不要假定程序中的一切都将按计划运行。例如,如果您要查找的文件已被移动该当如何?如果权限已被改变而无法读取其内容又当如何?您可以通过使用 file_exists 和 is_readable 预先检查这些问题。清单 7. 使用 file_exists 和 is_readable- $filename = "myfile";
- if (file_exists($filename) && is_readable ($filename)) {
- $fh = fopen($filename, "r");
- # Processing
- fclose($fh);
- }
但是,在实践中,用这样的代码可能太繁琐了。处理 fopen 的返回值更简单并且更准确。
- if ($fh = fopen($filename, "r")) {
- # Processing
- fclose($fh);
- }
由于失败时 fopen 将返回 False,这将确保仅当文件成功打开后才执行文件处理。当然,如果文件不存在或者不可读,您可以期望一个负返回值。这将使这个检查可以检查所有可能遇到的问题。此外,如果打开失败,可以退出程序或让程序显示错误消息。
如 fopen 函数一样,file_get_contents、file 和 readfile 函数都在打开失败或处理文件失败时返回 False。fgets、fgetss、fread、fscanf 和 fclose 函数在出错时也返回 False。当然,除 fclose 以外,您可能已经对这些函数的返回值都进行了处理。使用 fclose 时,即使文件处理未正常关闭,也不会执行什么操作,因此通常不必检查 fclose 的返回值。由您来选择PHP 不缺读取和解析文件的有效方法。诸如 fread 之类的典型函数可能在大多数时候都是最佳的选择,或者当 readfile 刚好能满足任务需要时,您可能会发现自己更为 readfile 的简单所吸引。它实际上取决于所要完成的操作。如果要处理大量数据,fscanf 将能证明自己的价值并比使用 file 附带 split 和 sprintf 命令更有效率。相反,如果要回显只做了少许修改的大量文本,则使用 file、file_get_contents 或 readfile 可能更合适。使用 PHP 进行缓存或者创建权宜的代理服务器时可能就属于这种情况。PHP 给您提供了大量处理文件的工具。深入了解这些工具并了解哪些工具最适合于要处理的项目。您已拥有很多的选择,因此好好地利用它们享受使用 PHP 处理文件的乐趣。