<html>
<head>
<title>文件的锁定机制</title>
</head>
<body>
<?php
//文件的锁定机制
//flock()
对文件进行锁定
$filename="message.txt";
//声明一个变量保存文件名,在这个文件中保存留言信息
if(isset($_POST['sub'])){
//判断用户是否点击了提交按钮
//接收表单中的三条内容,并整合为一条
$message=$_POST['username']."||".$_POST['title']."||".$_POST['message']."<|>";
writeMessage($filename,$message);
//用自定义的函数写入文件中
}
if(file_exists($filename)){
//判断文件存在时,则调用自定义函数来读取数据
readMessage($filename);
}
function writeMessage($filename,$message){
//自定义一个向文件中写入数据的函数
$f_handle=fopen($filename,'a');
//以追加的模式打开文件
if(flock($f_handle,LOCK_EX)){
//进行排他型锁定(独占锁定)
fwrite($f_handle,$message);
//将数据写入文件
flock($f_handle,LOCK_UN);
//释放文件锁定
}else{
echo "不能锁定文件";
//如果锁定失败,输出错误信息
}
}
function readMessage($filename){
//自定义一个遍历读取文件的函数
$fp=fopen($filename,"r") or die("文件读取失败");
//以只读的模式打开文件
flock($fp,LOCK_SH);
//建立文件的共享锁定
$buffer="";
//将文件中的数据遍历后放入到这个字符串中
while(!feof($fp)){
//使用while循环将文件中的内容遍历出来
$buffer.=fread($fp,1024);
//将文件中的内容追加到$buffer变量中
}
$data=explode("<|>",$buffer);
//使用分隔符将每条留言分隔开并存入到数组中
foreach($data as $line){
//遍历数组将每行留言内容以HTML输出
$message=explode("||",$line);
if($message[0]!="" && $message[1]!="" && $message[2]!=""){
echo $message[0]."说:";
echo ' '.$message[1];
echo $message[2]."<hr>";
}
}
flock($fp,LOCK_UN);
//释放文件的锁定
fclose($fp);
}
?>
<form action="" method="post">
<label>用户名:</label><input type="text" size="30" name="username" /><br><br>
<label>标 题:</label><input type="text" size="30" name="title" /><br><br>
<label>内 容:</label><textarea rows="4" cols="38" name="message">请在此处填写留言内容</textarea>
<input type="submit" name="sub" value="留言" />
</form>
</body>
</html>