如圖,我同時運行兩個腳本時,為什麼第二個腳本可以立即寫入文件呢,文件不是在第一個腳本中被加鎖了嗎
如圖,我同時運行兩個腳本時,為什麼第二個腳本可以立即寫入文件呢,文件不是在第一個腳本中被加鎖了嗎
PHP讀寫檔案是有鎖的 具體可以參考這個http://www.jb51.net/article/81246.htm
你的第二個fwrite之前沒有申請排它鎖LOCK_EX就操作了,當然會被寫入.
你必須兩個fwrite之前都應該申請LOCK_EX,這樣才能起到加鎖的作用.
<code>foo1.php: <?php header('Content-Type: text/plain; charset=utf-8'); if(file_exists('arr.php')) { $arr = require 'arr.php'; //先require后fopen } else { file_put_contents('arr.php','<?php return array();'); } $fp = fopen('arr.php', 'r+'); //读写方式打开,将文件指针指向文件头 if(flock($fp,LOCK_EX)) { //阻塞到获取排它锁 $arr['name'] = __FILE__; ftruncate($fp, 0); //截断文件 fwrite($fp,'<?php return '.var_export($arr, true).';'); var_export($arr); fflush($fp); //在释放锁之前刷新输出 sleep(10); //睡眠10秒,在此期间访问foo2.php将被阻塞 flock($fp, LOCK_UN); //释放锁定 } fclose($fp); foo2.php: <?php header('Content-Type: text/plain; charset=utf-8'); $arr = require 'arr.php'; $fp = fopen('arr.php', 'r+'); if(flock($fp,LOCK_EX)) { $arr['name'] = __FILE__; ftruncate($fp, 0); fwrite($fp,'<?php return '.var_export($arr, true).';'); var_export($arr); fflush($fp); flock($fp, LOCK_UN); } fclose($fp);</code>