12.3.5 文件的鎖定機(jī)制
flock -- 輕便的咨詢文件鎖定
語法: bool flock ( int handle, int operation [, int &wouldblock] )
PHP 支持以咨詢方式(也就是說所有訪問程序必須使用同一方式鎖定, 否則它不會(huì)工作)鎖定全部文件的一種輕便方法李请。
handle 必須是一個(gè)已經(jīng)打開的文件指針瞧筛。
operation 可以是以下值之一:
要取得共享鎖定(讀取程序),將 operation 設(shè)為 LOCK_SH导盅。
要取得獨(dú)占鎖定(寫入程序)较幌,將 operation 設(shè)為 LOCK_EX。
要釋放鎖定(無論共享或獨(dú)占)白翻,將 operation 設(shè)為 LOCK_UN乍炉。
如果你不希望 flock() 在鎖定時(shí)堵塞,則給 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>
標(biāo)題:<input type="text" name="title" value="" /><br>
內(nèi)容:<textarea name="content" cols="40" rows="4"></textarea><br>
<input type="submit" name="dosubmit" value="留言" /><br>
</form>