在項目中,一般都用到日誌,如資料庫查詢日誌、訪問日誌、對外介面請求返回參數日誌,本文主要和大家紹了PHP實現對檔案鎖進行加鎖、解鎖操作的方法,結合執行個體形式分析了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是執行達不到效果的。
相關推薦:
PHP通過加鎖實現並發搶購功能
實現MySQL語句加鎖的方法
Mysql高並發加鎖交易處理