PHP文件处理的高级应用

在PHP中除了可以对文件进行基本的读写操作外,还可以对文件指针进行查找、定位、对正在读取的文件进行锁定等。

远程文件的访问
在PHP中如果要访问远程文件,就必须将配置文件php.ini中的参数allow_url_fopen设置为开启。
allow_url_fopen参数默认是开启的,允许打开HTTP协议和FTP协议指定的远程文件。如果allow_url_fopen设置为off,则不允许打开远程文件,函数将返回false。
例如:
应用fopen()函数和readfile()函数访问一个远程文件,代码如下:

<?php
//访问远程文件
$filename="http://192.168.*.***/admin/file/***.txt";
$fp=fopen($filename,"rb");//打开文件
echo fread($fp,50);//使用fread()函数读取文件内容的前50个字节
echo '<br>';
//使用readfile()函数读取整个文件的内容
readfile("http://192.168.*.***/admin/file/***.txt","r");

文件指针
PHP可以实现文件指针的定位及查询,从而实现有用信息的快速查询。文件指针函数包括rewind()、fseek()、feof()和ftell()
1:rewind()函数
该函数将文件handle的指针设为文件流的开头,语法如下:
bool rewind(resource handle)
注意:如果将文件以附加(”a”)模式打开,写入文件的任何数据总是会被附加在后面,不论文件指针在何处。

2:fseek()函数
fseek()函数实现文件指针的定位。语法如下
该函数把文件指针从当前位置向前或向后移动到新的位置,新位置从文件头开始以字节数度量。
成功则返回 0;否则返回 -1。注意,移动到 EOF 之后的位置不会产生错误。
语法

fseek(file,offset,whence)
参数 描述
file 必需。规定要在其中定位的文件。
offset 必需。规定新的位置(从文件头开始以字节数度量)。(可以是负值)
whence 可选。可能的值: SEEK_SET - 设定位置等于 offset 字节。默认。 SEEK_CUR - 设定位置为当前位置加上 offset。 SEEK_END - 设定位置为文件末尾加上 offset (要移动到文件尾之前的位置,offset 必须是一个负值)。

3:feof()函数
该函数判断文件指针是否在文件尾。语法如下:
bool feof(resource handle)
如果文件指针处于文件结束的位置,就返回true,否则返回false

4:ftell()函数
ftell()函数返回当前指针位置,语法如下:
int ftell(resource handle)

例如:
使用4个指针函数来输出文件count.txt中的内容,代码如下:

<?php
$filename="count.txt";//指定文件路径以及文件名
if(is_file($filename)){//判断文件是否存在
    echo "文件总字节数: ".filesize($filename).'<br>';//输出总字节数
    $fopen=fopen($filename,"rb");//打开文件
    echo "初始指针位置:".ftell($fopen)."<br>";//输出初始指针位置
    fseek($fopen,30);//移动指针
    echo "使用fseek()函数后指针位置:".ftell($fopen)."<br>";//输出移动后指针的位置
    echo "输出当前指针后面的内容:".fgets($fopen)."<br>";//输出从当前行指针到行尾的内容
    if(feof($fopen)){//判断指针是否指向文件末尾
        echo "当前指针指向文件末尾: ".ftell($fopen)."<br>";//如果指向文件末尾则输出指针位置
    }
    rewind($fopen);//使用rewind()函数将指针移动到开头
    echo "使用rewind()函数后指针的位置:".ftell($fopen)."<br>";//输出使用rewind()函数后的指针位置
    echo "输出前33个字节的内容: ".fgets($fopen,33);//输出前33个字节的内容
    fclose($fopen);//关闭文件
}else{
    echo "文件不存在";
}

锁定文件
在向一个文本文件写入内容时,需要先锁定该文件,以防其他用户同时也修改此文件内容。PHP中锁定文件的函数为flock(),语法如下:
flock() 函数锁定或释放文件。
若成功,则返回 true。若失败,则返回 false。
语法

flock(file,lock,block)

参数 描述
file 必需。规定要锁定或释放的已打开的文件。
lock 必需。规定要使用哪种锁定类型。
block 可选。若设置为 1 或 true,则当进行锁定时阻挡其他进程。

说明

flock() 操作的 file 必须是一个已经打开的文件指针。
lock 参数可以是以下值之一:
要取得共享锁定(读取的程序),将 lock 设为 LOCK_SH(PHP 4.0.1 以前的版本设置为 1)。
要取得独占锁定(写入的程序),将 lock 设为 LOCK_EX(PHP 4.0.1 以前的版本中设置为 2)。
要释放锁定(无论共享或独占),将 lock 设为 LOCK_UN(PHP 4.0.1 以前的版本中设置为 3)。
如果不希望 flock() 在锁定时堵塞,则给 lock 加上 LOCK_NB(PHP 4.0.1 以前的版本中设置为 4)。
提示和注释

提示:可以通过 fclose() 来释放锁定操作,代码执行完毕时也会自动调用。
注释:由于 flock() 需要一个文件指针, 因此可能不得不用一个特殊的锁定文件来保护打算通过写模式打开的文件的访问(在 fopen() 函数中加入 “w” 或 “w+”)。

注意:在向文件写入数据时,使用w或w+选项来打开文件。这是如果用了LOCK_EX,在同一时间访问此文件的其他用户将无法得到文件的大小,也不能进行写操作。

例如:

<?php
$filename="count.txt";//指定文件路径以及文件名
$fd=fopen($filename,"w");//以w形式打开文件
flock($fd,LOCK_EX);//锁定文件(独占共享)
fwrite($fd,"hello world!");//向文件中写入数据
flock($fd,LOCK_UN);//解除锁定
fclose($fd);//关闭文件指针
readfile($filename);//输出文件内容

运行结果为:
hello world!

你可能感兴趣的:(PHP,应用,文件处理)