2.4.4 解决打开文件时可能遇到的问题

当打开文件时,可能经常遇到的错误是试图打开一个没有权限进行读写操作的文件(这种错误通常只会在类似于UNIX的操作系统见到,但是偶尔也会在Windows平台上遇到)。PHP将会给出一个类似于图2-2所示的警告。

2.4.4 解决打开文件时可能遇到的问题 - 图1

图 2-2 当一个文件不能打开时,PHP将给出特定警告

如果遇到这样的问题,必须确认运行该脚本的用户是否有权访问要使用的文件。根据服务器设置的不同,该脚本可能是作为Web服务器用户或者脚本所在目录的拥有者来运行的。

在大多数系统中,该脚本将作为Web服务器用户来运行。如果脚本是在UNIX系统的~/public_html/chapter2/目录下,输入如下所示的命令,可以创建一个全局可写的目录来存储订单:


mkdir~/orders

chmod 777~/orders


请记住,任何人都可以写的目录和文件是非常危险的。不应该具有可以从Web上直接可写的目录。正是由于这个原因,orders目录是两个子目录,都在public_html目录之上。在第15章中详细介绍安全问题。

设置了不正确的访问权限可能是造成打开文件时出现错误的常见原因。如果文件不能打开,你需要知道这一点,这样就不会再去读写数据。

如果fopen()函数调用失败,函数将返回false。可以以一种对于用户友好的方式来处理这个错误,可以通过抑制PHP的错误信息并且根据自己的方式给出错误信息:


@$fp=fopen("$DOCUMENT_ROOT/../orders/orders.txt",'ab');

if(!$fp){

echo"<p><strong>Your order could not be processed at this time."

.Please try again later.</strong></p></body></html>";

exit;

}


fopen()函数调用前面的@符号可以告诉PHP抑制所有由该函数调用所产生的错误。通常,在出现错误的时候,这是一个不错的方法。但是,在这种情况下,要在其他地方处理它。

以上代码也可以写成:


$fp=@fopen("$DOCUMENT_ROOT/../orders/orders.txt",'a');


但是,这样使用错误抑制操作符并不是非常直观,而且只会使得代码调试更困难。这里所介绍的方法只是处理错误的简单方法。在第7章中,我们将详细介绍错误处理的好方法。

if语句可以用来测试变量$fp,查看fopen()函数是否返回了一个有效的文件指针。如果没有,它就会打印出一个错误信息并且终止脚本的执行。由于页面在这一步结束执行,请注意,我们在这里关闭了HTML标记,从而可以生成有效的HTML。

当使用这种方法时,将得到如图2-3所示的输出。

2.4.4 解决打开文件时可能遇到的问题 - 图2

图 2-3 用自己的错误信息替代PHP的错误信息可以使用户觉得更加友好