您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關PHP如何實現對文件鎖進行加鎖、解鎖操作,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
在項目中,一般都用到日志,如數據庫查詢日志、訪問日志、對外接口請求返回參數日志,在處理日志時簡單的寫法如下
$file = 'log.txt'; $fp = fopen($file, 'a+'); if(!is_writable($file)){ die("The $file is not writable!"); } fwrite($fp, 'here'); fclose($fp);
但這種寫法是由瑕疵的,一個網站同一時間并不是只有一個用戶訪問的,在多個用戶同時訪問時,就會出現問題,也就是多個進程使用同一個資源時,前一個進程寫到一半后面的進程便開始寫了,因此最后生成的日志就亂了。這種情況下,就用到鎖了,在文件加鎖期間,其他進程是不會修改文件的,只有當文件解鎖時,才可以操作。寫法如下
$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); // 或是直接使用下面的這個例子,發現在sleep期間打印是個空值 //var_dump(file_get_contents($file));
測試時,先運行log.php,再運行test.php,會發現在sleep期間,test.php是執行達不到效果的。
1、執行速度快。2、具有很好的開放性和可擴展性。3、PHP支持多種主流與非主流的數據庫。4、面向對象編程:PHP提供了類和對象。5、版本更新速度快。6、具有豐富的功能。7、可伸縮性。8、功能全面,包括圖形處理、編碼與解碼、壓縮文件處理、xml解析等。
關于“PHP如何實現對文件鎖進行加鎖、解鎖操作”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。