2.4.2 使用fopen()打开文件

假设要将一个顾客订单写入Bob的订单文件中,可以使用如下所示的语句打开这个文件:


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


调用fopen()的时候,需要传递2个、3个或4个参数。通常使用2个参数,正如以上代码所示。

第一个参数是要打开的文件。正如以上代码所示,可以指定该文件的路径——在这里,orders.txt文件保存在orders目录中。我们已经使用了PHP内置变量$_SERVER['D OCUMENT_ROOT']。由于整个表单变量名称太长了,我们可以指定一个简短的名称。

这个变量指向了Web服务器文档树的根。我们使用“..”表示文档根目录的父目录。出于安全考虑的原因,这个目录位于整个文档树的外部。在这个例子中,除了通过我们所提供的接口之外,我们不希望还有其他Web接口能够访问它。这个路径称为相对路径,因为它描述了一个相对于文档根目录的文件系统位置。

由于我们为表单变量定义了一个简短名称,我们需要在脚本的开始处加上如下代码:


$DOCUMENT_ROOT=$_SERVER['DOCUMENT_ROOT'];


将冗长风格变量内容复制给简短风格的变量名称。

就像有不同的方法可以访问表单数据一样,也可以使用不同的方法访问预定义的服务器变量。根据服务器设置不同(请参阅第1章获得详细介绍),可以通过如下3种方式得到文档根目录:

■$_SERVER['DOCUMENT_ROOT']

■$DOCUMENT_ROOT

■$HTTP_SERVER_VARS['DOCUMENT_ROOT']

对于表单数据,第一个风格是首选的。

我们还可以指定文件的绝对路径。这个路径是从根目录开始的(在UNIX系统中,根目录是/,而在Windows系统中通常都是c:\)。在UNIX服务器中,根目录就是/home/book/orders。这样做的问题在于,特别是如果将网站安装在别人的服务器上,这个绝对路径可能会改变。我们曾经有过沉重的教训,如果系统管理员没有发出任何通知就决定修改目录结构后,我们就不得不手工更改包含在大量脚本中的绝对路径。

如果没有指定路径,这个文件就将在脚本自身所在的相同目录中查找或者创建。如果通过某种CGI封装程序来运行PHP的,这可能又会有所不同,具体需要根据服务器的设置而定。

在UNIX环境下,目录中的间隔符是正斜线(/)。如果你使用的是Windows平台,可以使用正斜线或者反斜线。如果使用反斜线,就必须使用转义(escape,标注为一个特殊字符)字符,这样fopen()函数才能正确理解这些字符。要转义一个字符,只需简单地在其前面添加一个反斜线。如下代码所示:


$fp=fopen("$DOCUMENT_ROOT\..\orders\orders.txt",'w');


在PHP代码中,只有少数人会使用反斜线,因为这意味着代码只能在Windows上运行。

如果使用了正斜线,代码不需要任何修改就可以在Windows和UNIX机器上运行。

fopen()函数的第二个参数是文件模式,它是一个字符串,指定了将对文件进行的操作。在这个例子中,我们将"w"传给了fopen()——这就意味着要以写的方式打开这个文件。表2-1给出了所有的文件模式及其意义。

2.4.2 使用fopen()打开文件 - 图1

在我们的例子中所使用的文件模式取决于需要如何使用这个系统。我们已经使用了"w",这表示只可以将一个订单写入文件中。每当一个新订单被写入文件,它将覆盖以前的订单。这样做可能没有什么意义,所以最好使用追加模式(以及推荐的二进制模式):


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


fopen()函数的第3个参数是可选的。如果要在include_path(在PHP的配置中设置。请参阅附录A)中搜索一个文件,就可以使用它。如果希望进行如此操作,可以将这个参数设置为1。如果希望PHP搜索include_path,就不需要提供目录名称或路径:


$fp=fopen('orders.txt','ab',true);


第4个参数也是可选的。fopen()函数允许文件名称以协议名称开始(例如,http://)并且在一个远程的位置打开文件。对于这个额外的参数,它还支持一些其他的协议。我们将在本章的下一节详细介绍该函数的使用。

如果fopen()成功地打开一个文件,该函数将返回一个指向这个文件的文件指针。在这个例子中,文件指针保存在$fp中。当读者的确希望能够读写这个文件时,将使用这个变量来访问文件。