概述
如果要并发读取、写入一个文件,就要对文件加锁,防止读、写混乱,造成结果有误,php使用函数 bool flock(int handle, int operation, int &wouldlock)函数对文件加锁
,详细如下面的例子:
留言板
/**
* 如果需要并发读取某文件,问了防止读写混乱,就要对打开的文件加锁
* bool flock(int handle, int operation, int &wouldblock)函数可以对文件加锁
* handle是一个文件指针,operation指定锁的类型,锁的类型包括:
* LOCK_SH 共享锁,读取文件时使用
* LOCK_EX 独占锁,写入文件时使用
* LOCK_UN 释放锁,上面两种锁都用它来释放(ps:当文件被fclose()掉后,锁也会被释放)
* LOCK_NB 附加锁,不过不希望flock()在锁定时堵塞,就应该在上面锁定后,再加上该锁
* 锁定阻塞是指已经被flock()锁定的文件,再次被flock()时,flock()函数就会挂起,解决方法除了
* 上面加上附加锁,还可以指定第三个参数wouldblock为1,意思是当文件锁定时会阻挡其他进程。
*/
echo "
网络留言板
";$fileName = "guestbook.txt";
//调用自定义函数,读取留言板中的消息
if(file_exists($fileName))
readMessage($fileName);
//如果用户提交了留言,就调用自定义函数,写入到留言板中
if(isset($_POST['submitBtn']))
writeMessage($fileName, $_POST['username'] . $_POST['title'] . $_POST['content']);
function readMessage($fileName)
{
$fileHandle = fopen($fileName, "r");
flock($fileHandle, LOCK_SH);
$allMessages = "";
//循环读取文件中的留言
while(!feof($fileHandle))
$allMessages .= fgets($fileHandle);
$messageArray = explode("|", $allMessages);
foreach ($messageArray as $message)
{
echo $message . "
";
}
flock($fileHandle, LOCK_UN);
fclose($fileHandle);
}
//写入留言板
function writeMessage($fileName, $message)
{
$fileHandle = fopen($fileName, "a");
flock($fileHandle, LOCK_EX);
$message .= "|";
fwrite($fileHandle, $message) or die("留言写入失败");
flock($fileHandle, LOCK_UN);
fclose($fileHandle);
}
/**
* 如果要防止锁定阻塞,可以附加LOCK_NB锁
* flock($fileHandle, LOCK_EX+LOCK_NB);
* flock($fileHandle, LOCK_UN+LOCK_NB);
*/
?>
昵称:
标题:
留言:请输入留言
最后
以上就是单薄航空为你收集整理的php 锁的机制_php文件的锁定机制 - youthflies的个人空间 - OSCHINA - 中文开源技术交流社区...网络留言板的全部内容,希望文章能够帮你解决php 锁的机制_php文件的锁定机制 - youthflies的个人空间 - OSCHINA - 中文开源技术交流社区...网络留言板所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复