PHP文件操作及实例:留言板
一、文件操作函数
1.创建文件:touch('./xxx.php');
bool touch ( string $filename [, int $time = time() [, int $atime ]] )
2.复制文件:copy('./xxx.php','./yyy.php');
3.移动或重命名:rename('./xxx.php','./yyy.php');
4.删除文件:unlink('./xxx.php');
5.截取文件:ftruncate('./xxx.php',$size);
6.文件内容操作:
a.file_get_contents('./xxx.php');获取文件 b.file_put_contents('./xxx.php','aaa');写入文件 注:可以远程读取文件,如:file_put_contents('./xxx.php',file_get_contents('http://www.baidu.com')); C.读文件readfile('http://www.baidu.com'); d.$arr=file('./xxx.php'):将文件存为数组,每一行是一个元素
注:以上涉及读取文件内容的函数无需先打开文件
二、文件的打开与关闭
1.$open=fopen('./xxx.php','r');
resource fopen ( string $filename , string $mode [, bool $use_include_path = false [, resource $context ]] )
注:附加Mode:b操作二进制文件时加上,t文本文件
2.fclose($open);
3.fwrite($open,'aaaa');可以更改fopen的mode,改变每次写入是否覆盖
4.fgetc($open);一次读取文件一个字符
5.feof($open);指针到文件结尾返回true,可用作if判断
6.fgets($open);一次读取文件一行
7.fread($open,1024);一次读取指定长度(字节数)的字符
注:以上读取文件内容必须先打开文件
while(!feof($open)){ echo fgetc($open); echo fgets($open); echo fread($open,filesize($open)); }
三、移动文件的指针
1.ftell($open);返回指针当前位置,默认为开始
2.fseek($open,-4,SEEK_END);将指针移动至某位置,如从文件尾前移4个字节,注意结尾可能有换行符。可以配合fopen的a追加模式更方便的操作
$whence值可以是: •SEEK_SET - 设定位置等于 offset 字节。 •SEEK_CUR - 设定位置为当前位置加上 offset。 •SEEK_END - 设定位置为文件尾加上 offset。
3.rewind($open);将指针放到开头
四、文件的锁定机制
1.flock($open,LOCK_SH):读取/写入文件时都需要锁定(LOCK_SH/LOCK_EX),以防止多人同时操作,解锁时方法相同(LOCK_UN)
注:$handle必须指向一个打开的文件资源
bool flock ( resource $handle , int $operation [, int &$wouldblock ] )
operation 可以是以下值之一: ◦ LOCK_SH取得共享锁定(读取的程序)。 ◦ LOCK_EX 取得独占锁定(写入的程序。 ◦ LOCK_UN 释放锁定(无论共享或独占)。
五、实例:留言板
<?php $filename='message.txt'; if(isset($_POST['dosubmit'])){ $content="{$_POST['username']}||".time()."||{$_POST['title']}||{$_POST['content']}[n]"; writeMessage($filename,$content); } if(file_exists($filename)){ date_default_timezone_set('PRC'); readMessage($filename); } function writeMessage($filename,$content){ $open=fopen($filename,'a'); if(flock($open,LOCK_EX+LOCK_NB)){//添加写入锁及防阻塞 fwrite($open,$content); flock($file,LOCK_UN+LOCK_NB);//释放写入锁及防阻塞 }else{ echo "写入锁定失败!"; } fclose($open); } function readMessage($filename){ //不打开文件读取,无法加锁 //$mess=rtrim(file_get_contents($filename),'[n]'); $mess=''; $file=fopen($filename,'r'); if(flock($file,LOCK_SH+LOCK_NB)){//添加读取锁及防阻塞 while(!feof($file)){ $mess.=fread($file,1024); } flock($file,LOCK_UN+LOCK_NB);//释放读取锁及防阻塞 }else{ echo "读取锁定失败!"; } $mess=rtrim($mess,'[n]'); $arr=explode('[n]',$mess); foreach($arr as $value){ list($username,$time,$title,$content)=explode("||",$value); echo "<b>{$username}</b>,".date('y-m-d h:i',$time).":<i>{$title}</i>,<u>{$content}</u><br><hr><br>"; } fclose($file); } ?> <!DOCTYPE > <html> <head> <meta charset="utf-8"> <style> input{ display: block; } textarea{ display: block; } </style> </head> <body> <form action="message.php" method="post"> <label for="uesrname">用户名:</label><input type="text" value="" name="username" id="username" /> <label for="title">标 题:</label><input type="text" value="" name="title" id="title" /> <label for="content">内 容:</label><textarea cols="40" rows="10" id="content" name="content"></textarea> <button type="submit" name="dosubmit">提 交</button> </form> </body> </html>