存储数据有两种基本方法:保存到普通文件或保存到数据库中。
普通文件可以具有多种格式,但是,通常所知的普通文件是简单的文本文件。但这如果使用存储文件作为存储大量数据的方式会有很多弊端。
1 文件处理
1.1 打开文件
服务器上的操作系统必须要知道要对打开的文件进行什么操作,需要了解这个文件是否还允许其它脚本在打开,还需要了解使用者是否有在这种方式下使用该文件的权限。
要在PHP中打开一个文件,可以使用 fopen()
函数。如果 fopen()
成功地打开一个文件,该函数将发挥一个指向这个文件的文件指针,此时可以使用这个变量来访问文件。
fopen()
函数的参数如下:
- 文件位置
- 文件模式,模式有以下几种:
r
:只读,打开文件,从文件头开始读(该文件必须存在)r+
:用于读和写,从文件头开始读写(该文件必须存在)w
:只写,从文件头开始读,如果该文件存在,则删除所有文件已有内容,反之创建该文件w+
:用于读和写,从文件头开始读写,如果该文件存在,则删除所有文件已有内容,反之创建该文件a
:只读追加模式,打开文件,如果文件存在,则从文件末尾开始追加,反之创建该文件a+
:可读可写追加模式,打开文件,如果文件存在,则从文件末尾开始追加,反之创建该文件b
:二进制模式
- 布尔值(可选),是否在
include_path
中搜索一个文件(此值在PHP的配置中设置) - 协议名称(可选),除了打开一个本地文件进行督学操作之外,还可以通过
FTP
、HTTP
或其他协议打开文件。
指定文件路径时可以使用到超级全局变量中的 $_SERVER['DOCUMENT_ROOT']
,这个变量指向了Web服务器文档树的根目录,同时指定路径可以为绝对路径或者是相对路径,在UNIX环境中,目录之间的间隔符是 /
(正斜线),而使用Windows平台可以使用正斜线或反斜线,如果使用的是反斜线,则需要转义,所以最好还是使用正斜线,一劳永逸。
在使用 fopen()
函数的时候,需要顾及到是否创建文件指针成功,此时可以使用 @
抑制错误符,然后检测储存文件指针的变量是否为空。
1.2 写文件
在PHP中写文件可以使用 fwrite()
或者 fputs()
,其中 fputs
是 fwrite()
的别名函数。也可以使用 file_put_contents()
函数。
1.2.1 fwrite()
函数
fwrite()
函数的语法是 int fwrite($fp, $outputstring, [,length]);
,其中的 $fp
为文件指针,$outputstring
为输入内容,可选参数是写入的最大字符数。
1.2.2 file_put_contents()
函数
file_put_contents()
函数是 PHP5 才有的函数,它的语法是 int file_put_contents(filename, data, [,int flags, rescource context]);
,此函数无需调用 fopen()
函数打开要写的文件以及也无需使用 fclose()
关闭文件。
1.3 读取文件
读取文件可以使用 fgets()
函数、 file_get_contents()
函数等等。
1.3.1 fgets()
函数、fgetss()
函数、fgetcsv()
函数
fgets()
函数的语法是 fgets($fp, int length);
,第二个参数为读取的长度。
fgetss()
函数的用法与 fgets()
函数的用法差不多,区别在于前者可以过滤掉字符串中包含的PHP和HTML
标记。
fgetcsv()
函数的语法是 fgetcsv()
语法是 fgetcsv($fp, length, enclosure)
,其中 enclosure
表示一个定界符,将它换成的换行符显示。
1.3.2 readfile()
、fpassthru()
、file()
以上函数可用为读取整个文件。
1.4 关闭文件 fclose()
当文件使用完后,应该将其关闭,此时要使用 fclose()
函数,如果文件成功关闭,将返回一个 true
值。
1.5 锁定文件 flock()
在操作写入文件时,必须要注意到与此同时有没有其他用户也正在使用该文件,以免发生冲突,此时锁定文件就很有必要了。
flock()
函数语法是 bool flock($fp, int operation)
,锁定成功返回 true
,其中的 operation
为:
LOCK_SH
:读操作锁定,意味着文件可以共享LOCK_EX
:写操作锁定,意味着文件不能共享LOCK_UN
:释放所有的锁定LOCK_NB
:防止在请求加锁时发生阻塞
1.6 其他一些关于文件操作的函数
- 检测读取文件是否到达末尾
feof()
:while (!feof($fp))
- 查看文件是否存在
file_exists()
- 确定文件大小
filesize()
- 删除文件
unlink()
- 文件定位及定位查询:
fwind()
、fseek()
、ftell()