一、fopen
- 打开文件或者URL。
格式:
fopen( string $filename,string $mode [,bool $use_include_path = false [,resource $context ]])
fopen() //将 filename 指定的名字资源绑定到一个流上。
参数
$filename
-
如果 filename 是 “scheme://…” 的格式,则被当成一个 URL,PHP 将搜索协议处理器(也被称为封装协议)来处理此模式。如果该协议尚未注册封装协议,PHP 将发出一条消息来帮助检查脚本中潜在的问题并将 filename 当成一个普通的文件名继续执行下去。
-
如果 PHP 认为 filename 指定的是一个本地文件,将尝试在该文件上打开一个流。该文件必须是 PHP 可以访问的,因此需要确认文件访问权限允许该访问。如果激活了安全模式或者 open_basedir 则会应用进一步的限制。
-
如果 PHP 认为 filename 指定的是一个已注册的协议,而该协议被注册为一个网络 URL,PHP 将检查并确认 allow_url_fopen 已被激活。如果关闭了,PHP 将发出一个警告,而 fopen 的调用则失败。
$mode
- mode 参数指定了所要求到该流的访问类型。可以是以下:
model | 说明 |
---|---|
r | 只读方式打开,将文件指针指向文件头。 |
r+ | 读写方式打开,将文件指针指向文件头。 |
w | 写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。 |
w+ | 读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之 |
a | 写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。 |
a+ | 读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。 |
x | 创建并以写入方式打开,将文件指针指向文件头。如果文件已存在,则 fopen() 调用失败并返回 FALSE,并生成一条 E_WARNING 级别的错误信息。如果文件不存在则尝试创建之。这和给 底层的 open(2) 系统调用指定 O_EXCL |
返回值
- 成功时返回文件指针资源(如何调用fopen()打开的资源),如果打开失败,本函数返回 FALSE。
错误/异常
- 如果打开失败,会产生一个 E_WARNING 错误。可以通过 @ 来屏蔽错误。
更新日志
版本 | 说明 |
---|---|
4.3.2 | 自 PHP 4.3.2 起,对所有区别二进制和文本模式的平台默认模式都被设为二进制模式。如果在升级后脚本碰到问题,尝试暂时使用 ‘t’ 标记,直到所有的脚本都照以下所说的改为更具移植性以后。 |
4.3.2 | 增加了选项 ‘x’ 和 ‘x+’ |
5.2.6 | 增加了选项 ‘c’ 和 ‘c+’ |
有时我们会看到,fopen中mode值包含一个"b"字符,例如"wb",这是怎么回事呢?
这是因为:
-
不同的操作系统家族具有不同的行结束习惯。当写入一个文本文件并想插入一个新行时,需要使用符合操作系统的行结束符号。基于 Unix 的系统使用 \n 作为行结束字符,基于 Windows 的系统使用 \r\n 作为行结束字符,基于 Macintosh 的系统使用 \r 作为行结束字符。
-
如果写入文件时使用了错误的行结束符号,则其它应用程序打开这些文件时可能会表现得很怪异。
-
Windows 下提供了一个文本转换标记(‘t’)可以透明地将 \n 转换为 \r\n。与此对应还可以使用 ‘b’ 来强制使用二进制模式,这样就不会转换数据。要使用这些标记,要么用 ‘b’ 或者用 ‘t’ 作为 mode 参数的最后一个字符。
默认的转换模式依赖于 SAPI 和所使用的 PHP 版本,因此为了便于移植鼓励总是指定恰当的标记。如果是操作纯文本文件并在脚本中使用了 \n 作为行结束符,但还要期望这些文件可以被其它应用程序例如 Notepad 读取,则在 mode 中使用 ‘t’。在所有其它情况下使用 ‘b’。 -
在操作二进制文件时如果没有指定 ‘b’ 标记,可能会碰到一些奇怪的问题,包括坏掉的图片文件以及关于 \r\n 字符的奇怪问题。
为移植性考虑,强烈建议在用 fopen() 打开文件时总是使用 ‘b’ 标记。
//fopen中文乱码:
iconv('UTF-8', 'GBK', $fileName);
范例
<?php
$handle = fopen("/home/rasmus/file.txt", "r");
$handle = fopen("/home/rasmus/file.gif", "wb");
$handle = fopen("http://www.example.com/", "r");
$handle = fopen("ftp://user:password@example.com/somefile.txt", "w");
?>
相关函数
-
fwrite() 函数用于向文件写入字符串,成功返回写入的字符数,否则返回 FALSE 。
-
fread()函数从文件指针 handle 读取最多 length 个字节。该函数在读取完最多 length 个字节数,或到达 EOF 的时候,或(对于网络流)当一个包可用时,或(在打开用户空间流之后)已读取了 8192 个字节时就会停止读取文件。
-
feof()函数
-
feof() 函数检测是否已到达文件末尾 (eof)。
如果文件指针到了 EOF 或者出错时则返回 TRUE,否则返回一个错误(包括 socket 超时),其它情况则返回 FALSE。我们上面的代码,在获取到$file资源之后,循环判断是否到了文件结尾,没到结尾的话,就继续执行下面的代码。 -
注意
feof() 函数对遍历长度未知的数据很有用。如果服务器没有关闭由 fsockopen() 所打开的连接,feof() 会一直等待直到超时而返回 TRUE。默认的超时限制是 60 秒,可以使用 stream_set_timeout() 来改变这个值。
如果传递的文件指针无效可能会陷入无限循环中,因为 EOF 不会返回 TRUE。
- fgets() 函数从文件指针中读取一行。
- fclose() 函数关闭该指针指向的文件(关闭打开的文件),如果成功则返回 true,否则返回 false。文件指针必须有效,并且是通过 fopen() 或 fsockopen() 成功打开的。
php fopen函数实例
1、使用fopen函数创建文件:
$my_file = 'file.txt';//如果文件不存在(默认为当前目录下)
$handle = fopen($my_file, 'w') or die('Cannot open file: '.$my_file); //implicitly creates file
2、使用fopen函数打开文件:
$my_file = 'file.txt';//假设文件file.txt存在
$handle = fopen($my_file, 'w') or die('Cannot open file: '.$my_file); //open file for writing ('w','r','a')
3、fopen函数结合fread读取文件:
$my_file = 'file.txt';
$handle = fopen($my_file, 'r');
$data = fread($handle,filesize($my_file));
4、fopen函数结合fwrite函数写文件
$my_file = 'file.txt';
$handle = fopen($my_file, 'w') or die('Cannot open file: '.$my_file);
$data = 'This is the data';
fwrite($handle, $data);
5、fopen函数结合fwrite函数向文件中追加内容:
$my_file = 'file.txt';
$handle = fopen($my_file, 'a') or die('Cannot open file: '.$my_file);
$data = 'New data line 1';
fwrite($handle, $data);
$new_data = "\n".'New data line 2';
fwrite($handle, $new_data);
6、fopen() 函数还可用于打开互联网上的 URL 地址:
<?php
$fh = fopen("http://www.baidu.com/", "r");
if($fh){
while(!feof($fh)) {
echo fgets($fh);
}
}
fclose($fh);
?>
- feof() 函数检测是否已到达文件末尾 (eof)。
注意:fopen() 返回的只是一个资源,要想显示打开的页面地址,还需要用 fgets() 函数读取并输出