本文實例講述了PHP實現(xiàn)對文件鎖進行加鎖、解鎖操作的方法。分享給大家供大家參考,具體如下:
在項目中,一般都用到日志,如數(shù)據(jù)庫查詢?nèi)罩尽⒃L問日志、對外接口請求返回參數(shù)日志,在處理日志時簡單的寫法如下
$file = 'log.txt'; $fp = fopen($file, 'a+'); if(!is_writable($file)){ die("The $file is not writable!"); } fwrite($fp, 'here'); fclose($fp);
但這種寫法是由瑕疵的,一個網(wǎng)站同一時間并不是只有一個用戶訪問的,在多個用戶同時訪問時,就會出現(xiàn)問題,也就是多個進程使用同一個資源時,前一個進程寫到一半后面的進程便開始寫了,因此最后生成的日志就亂了。這種情況下,就用到鎖了,在文件加鎖期間,其他進程是不會修改文件的,只有當文件解鎖時,才可以操作。寫法如下
$file = 'log.txt'; $fp = fopen($file, 'a+'); if(!is_writable($file)){ exit("The $file is not writable!"); } flock($fp, LOCK_EX);// 加鎖 fwrite($fp, 'here'); flock($fp, LOCK_UN);// 解鎖 fclose($fp);
如果想測試下在文件加鎖期間其他進程操作不了文件的例子,可以用下面給出的demo
log.php
$file = 'log.txt'; $fp = fopen($file, 'a+'); if(!is_writable($file)){ exit("The $file is not writable!"); } flock($fp, LOCK_EX); fwrite($fp, 'here'); sleep(10); flock($fp, LOCK_UN); fclose($fp);
test.php
$file = 'lock.txt'; $fp = fopen($file, 'a'); fwrite($fp, 'good'); // 在sleep期間寫不進去 fclose($fp); // 或是直接使用下面的這個例子,發(fā)現(xiàn)在sleep期間打印是個空值 //var_dump(file_get_contents($file));
測試時,先運行l(wèi)og.php,再運行test.php,會發(fā)現(xiàn)在sleep期間,test.php是執(zhí)行達不到效果的。
更多關于PHP相關內(nèi)容感興趣的讀者可查看本站專題:《php文件操作總結》、《PHP常用遍歷算法與技巧總結》、《PHP數(shù)據(jù)結構與算法教程》、《php程序設計算法總結》、《PHP數(shù)組(Array)操作技巧大全》、《php字符串(string)用法總結》及《php常見數(shù)據(jù)庫操作技巧匯總》
希望本文所述對大家PHP程序設計有所幫助。
【網(wǎng)站聲明】本站除付費源碼經(jīng)過測試外,其他素材未做測試,不保證完整性,網(wǎng)站上部分源碼僅限學習交流,請勿用于商業(yè)用途。如損害你的權益請聯(lián)系客服QQ:2655101040 給予處理,謝謝支持。