PHP 读取文件的最佳实践

绝不要假定程序中的一切都将按计划运行。例如,如果您要查找的文件已被移动该当如何?如果权限已被改变而无法读取其内容又当如何?您可以通过使用 file_exists 和 ...

绝不要假定程序中的一切都将按计划运行。例如,如果您要查找的文件已被移动该当如何?如果权限已被改变而无法读取其内容又当如何?您可以通过使用 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 处理文件的乐趣。


添加新评论