如果要并发读取、写入一个文件,就要对文件加锁,防止读、写混乱,造成结果有误,php使用函数 bool flock(int handle, int operation, int &wouldlock)函数对文件加锁
,详细如下面的例子:
<html> <head> <title> 留言板 </title> </head> <body> <?php /** * 如果需要并发读取某文件,问了防止读写混乱,就要对打开的文件加锁 * 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 "<h1>网络留言板</h1>"; $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 . "<br />"; } 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); */ ?> <form action="file5.php" method="post"> 昵称:<input type="text" name="username" value="请输入昵称" onfocus="if(this.value=='请输入昵称') this.value=''" onblur="if(this.value=='') this.value='请输入昵称'"> <br /> 标题:<input type="text" name="title" value="请输入标题" onfocus="if(this.value=='请输入标题') this.value=''" onblur="if(this.value=='') this.value='请输入标题'"><br /> 留言:<textarea name="content" rows=4 cols=40 onfocus="if(this.value=='请输入留言') this.value=''" onblur="if(this.value=='') this.value='请输入留言'">请输入留言</textarea><br /> <input type="submit" name="submitBtn" value="提交"> </form> </body> </html>
版权声明
本站文章、图片、视频等(除转载外),均采用知识共享署名 4.0 国际许可协议(CC BY-NC-SA 4.0),转载请注明出处、非商业性使用、并且以相同协议共享。
© 空空博客,本文链接:https://www.yeetrack.com/?p=66
近期评论