12.3.5 文件的锁定机制
flock -- 轻便的咨询文件锁定
语法: bool flock ( int handle, int operation [, int &wouldblock] )
PHP 支持以咨询方式(也就是说所有访问程序必须使用同一方式锁定, 否则它不会工作)锁定全部文件的一种轻便方法。
handle 必须是一个已经打开的文件指针。
operation 可以是以下值之一:
要取得共享锁定(读取程序),将 operation 设为 LOCK_SH。
要取得独占锁定(写入程序),将 operation 设为 LOCK_EX。
要释放锁定(无论共享或独占),将 operation 设为 LOCK_UN。
如果你不希望 flock() 在锁定时堵塞,则给 operation 加上 LOCK_NB。
如果成功则返回 TRUE,失败则返回 FALSE。
message.php
<?php
header("Content-Type:text/html;charset=utf8");
$filename = "message.txt";
//如果用户提交了, 就写入文件, 按一定格式写入
if(isset($_POST['dosubmit'])) {
//字段的分隔使用||, 行的分隔使用[n]
$mess = "{$_POST['username']}||".time()."||{$_POST['title']}||{$_POST['content']}[n]";
writemessage($filename, $mess);
}
if(file_exists($filename)) {
readmessage($filename);
}
function writemessage($filename, $mess) {
$fp = fopen($filename, "a");
if(flock($fp, LOCK_EX+LOCK_NB)) {
fwrite($fp, $mess);
flock($fp, LOCK_UN+LOCK_NB);
} else {
echo "写入锁定失败!";
}
fclose($fp);
}
function readmessage($filename) {
// $mess = file_get_contents($filename);
$mess = "";
$fp = fopen($filename, "r");
flock($fp, LOCK_SH+LOCK_NB); //读锁定
while(!feof($fp)) {
$mess.=fread($fp, 1024);
}
flock($fp, LOCK_UN+LOCK_NB); //释放
$mess = rtrim($mess, "[n]");
$arrmess = explode("[n]", $mess);
foreach($arrmess as $m) {
list($username, $dt ,$title, $content) = explode("||", $m);
echo "<b>{$username}</b>, ".date("Y-m-d H:i").": <i>{$title}</i>, <u>{$content}</u><br><hr><br>";
}
fclose($fp);
}
?>
<form action="message.php" method="post">
用户: <input type="text" name="username" value="" /><br>
标题:<input type="text" name="title" value="" /><br>
内容:<textarea name="content" cols="40" rows="4"></textarea><br>
<input type="submit" name="dosubmit" value="留言" /><br>
</form>