在PHP使用 fopen 函数打开文件demo
how-to-user-php-fopen
调用fopen()函数的时候,需要传递2个、3个或4个参数。通常使用2个参数即可,正下代码所示。
假设要将sitemap信息写入sitemap.xml文件中,可以用如下语句打开这个文件:
$fp = fopen("$DOCUMENT_ROOT/../sitemap/sitemap.xml",'w');
第一个参数是要打开的文件。正如上代码所示,可以指定该文件的路径——在这里,sitemap.xml文件保存在sitemap目录中。我们已经使用了 PHP 内置变量 $_SERVER[‘DOCUMENT_ROOT’] 。由于整个表单的名称太长了,我们可以指定一个简短的名称。
这个变量指向了Web服务器文档树的根。我们使用“..”表示文档根目录的父目录。出于安全考虑的原因,这个目录位于整个文档树的外部。在这个例子中,除了通过我们所提供的接口之外,我们不希望还有其他 Web 接口能够访问它。这个路径称之为相对路径,因为它描述了一个相对于文档根目录的文件系统位置。
由于我们为表单定义了一个简短名称,我们需要在脚本的开始处加上如下代码:
$DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT'];
将冗长风格变量内容复制给简短风格的变量名称。
就像有不同的方法可以访问表单数据一样,也可以使用不同的方法访问预定义的服务器变量。根据服务器设置不同,可以通过如下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\\..\\sitemap\\sitemap.xml",'w');
在PHP代码中,只有少数人会使用反斜线,因为这意味着代码智能在Windows上运行。
如果使用了正斜线,代码不需要任何修改就可以在Windows和UNIX机器上运行。
fopen()函数的第二个参数是文件模式,它是一个字符串,指定了将对文件进行的操作。
在这个例子中,我们将“w”传给了fopen()——这就意味着要以只写的方式打开这个文件
下表给出了所有文件模式及其意义。
fopen() 函数的文件模式总结表 | ||
模式 | 模式名称 | 模式意义 |
r | 只读 | 只读模式——从文件头开始读取 |
r+ | 只读 | 读写模式——从文件头开始读写 |
w | 只写 | 只写模式——从文件头开始读取,如果这个文件已经存在,将删除所有文件已有内容。如果该文件不存在,函数将创建和这个文件 |
w+ | 只写 | 只写模式——从文件头开始读写,如果这个文件已经存在,将删除所有文件已有内容。如果该文件不存在,函数将创建和这个文件 |
x | 谨慎写 | 只写模式——才能够文件头开始写。如果文件已经存在,该文件将不会被打开,fopen()函数将返回false,而且PHP将产生一个警告 |
x+ | 谨慎写 | 读写模式——才能够文件头开始写。如果文件已经存在,该文件将不会被打开,fopen()函数将返回false,而且PHP将产生一个警告 |
a | 追加 | 追加模式——如果该文件已有内容,将从文件末尾开始追加(写),如果该文件不存在,函数将创建这个文件。 |
a+ | 追加 | 追加模式——如果该文件已有内容,将从文件末尾开始追加(写)或者读,如果该文件不存在,函数将创建这个文件。 |
b | 二进制 | 二进制模式——用于与其他模式进行链接。如果文件系统能够区分二进制文件和文本文件,你可能会使用它。Windows系统可以区分,而UNIX则不区分。推荐一直用这个选项,以便最大程度的可移植性。二进制模式是默认模式 |
t | 文本 | 用于与其他模式的结合。这个模式只是Windows系统下一个选项,它不是推荐选项,除非你曾在代码中使用了b选项 |
在我们的例子中所使用的文件模式取决于需要如何使用这个系统.
例子中我们已经用了“w”,这表示可以将一个网址写入文件中.每当一个新网址被写入文件,它将覆盖以前的订单.这样做可能没有什么意义,所以最好使用追加模式(以及推荐的二进制模式):
$fp = fopen("$DOCUMENT_ROOT/../sitemap/sitemap.xml","ab");
fopen()函数的第3个参数是可选的.
如果要在include_path(在PHP的配置中设置)中搜索一个文件,就可以用它.如果希望进行此操作,可以将这个参数设置为1.如果希望PHP搜索include_path,就不需要提供目录名称或路径:
1.$fp = fopen('sitemap.xml','ab',true);
第4个参数也是可选的.fopen()函数允许文件名称以协议名称开始(例如,http://)并且在一个远程的位置打开文件.对于这个额外的参数,它还支持一些其他的协议.
如果fopen()成功地打开一个文件,该函数将返回一个指向这个文件的文件指针.在这个例子中,文件指针保存在$fp中.
当读者的确希望能够读写这个文件时,将使用这个变量来访问文件
how-to-user-php-fopen