在專案中,一般都用到日誌,如資料庫查詢日誌、存取日誌、對外介面請求回傳參數日誌,本文主要和大家紹了PHP實作對文件鎖進行加鎖、解鎖操作的方法,結合實例形式分析了PHP針對文件進行加鎖、解鎖操作的功能、實現方法與相關注意事項,需要的朋友可以參考下,希望能幫助到大家。
1 2 3 4 5 6 7 | $file = 'log.txt';
$fp = fopen ( $file , 'a+');
if (! is_writable ( $file )){
die ( "The $file is not writable!" );
}
fwrite( $fp , 'here');
fclose( $fp );
|
登入後複製
但這種寫法是由瑕疵的,一個網站同一時間並不是只有一個用戶訪問的,在多個用戶同時訪問時,就會出現問題,也就是多個行程使用同一個資源時,前一個行程寫到一半後面的行程就開始寫了,因此最後產生的日誌就亂了。這種情況下,就用到鎖了,在檔案加鎖期間,其他進程是不會修改檔案的,只有當檔案解鎖時,才可以操作。寫法如下
1 2 3 4 5 6 7 8 9 | $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
1 2 3 4 5 6 7 8 9 10 | $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
#
1 2 3 4 5 6 | $file = 'lock.txt';
$fp = fopen ( $file , 'a');
fwrite( $fp , 'good');
fclose( $fp );
|
登入後複製
測試時,先執行log.php,再執行test.php ,會發現在sleep期間,test.php是執行無法達到效果的。
相關推薦:
PHP透過加鎖實作並發搶購功能
實作MySQL語句加鎖的方法
Mysql高並發加鎖事務處理
以上是PHP為檔案加鎖、解鎖操作的方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!