PHP實(shí)現(xiàn)對(duì)文件鎖進(jìn)行加鎖、解鎖操作的方法
本文實(shí)例講述了PHP實(shí)現(xiàn)對(duì)文件鎖進(jìn)行加鎖、解鎖操作的方法。分享給大家供大家參考,具體如下:
在項(xiàng)目中,一般都用到日志,如數(shù)據(jù)庫(kù)查詢(xún)?nèi)罩?、訪問(wèn)日志、對(duì)外接口請(qǐng)求返回參數(shù)日志,在處理日志時(shí)簡(jiǎn)單的寫(xiě)法如下
$file = 'log.txt'; $fp = fopen($file, 'a+'); if(!is_writable($file)){ die("The $file is not writable!"); } fwrite($fp, 'here'); fclose($fp);
但這種寫(xiě)法是由瑕疵的,一個(gè)網(wǎng)站同一時(shí)間并不是只有一個(gè)用戶(hù)訪問(wèn)的,在多個(gè)用戶(hù)同時(shí)訪問(wèn)時(shí),就會(huì)出現(xiàn)問(wèn)題,也就是多個(gè)進(jìn)程使用同一個(gè)資源時(shí),前一個(gè)進(jìn)程寫(xiě)到一半后面的進(jìn)程便開(kāi)始寫(xiě)了,因此最后生成的日志就亂了。這種情況下,就用到鎖了,在文件加鎖期間,其他進(jìn)程是不會(huì)修改文件的,只有當(dāng)文件解鎖時(shí),才可以操作。寫(xiě)法如下
$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);
如果想測(cè)試下在文件加鎖期間其他進(jìn)程操作不了文件的例子,可以用下面給出的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期間寫(xiě)不進(jìn)去 fclose($fp); // 或是直接使用下面的這個(gè)例子,發(fā)現(xiàn)在sleep期間打印是個(gè)空值 //var_dump(file_get_contents($file));
測(cè)試時(shí),先運(yùn)行l(wèi)og.php,再運(yùn)行test.php,會(huì)發(fā)現(xiàn)在sleep期間,test.php是執(zhí)行達(dá)不到效果的。
更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《php文件操作總結(jié)》、《PHP常用遍歷算法與技巧總結(jié)》、《PHP數(shù)據(jù)結(jié)構(gòu)與算法教程》、《php程序設(shè)計(jì)算法總結(jié)》、《PHP數(shù)組(Array)操作技巧大全》、《php字符串(string)用法總結(jié)》及《php常見(jiàn)數(shù)據(jù)庫(kù)操作技巧匯總》
希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。
- PHP 文件鎖與進(jìn)程鎖的使用示例
- 簡(jiǎn)單談?wù)?php 文件鎖
- PHP程序中的文件鎖、互斥鎖、讀寫(xiě)鎖使用技巧解析
- PHP文件鎖函數(shù)flock()詳細(xì)介紹
- PHP文件鎖定寫(xiě)入實(shí)例解析
- PHP flock 文件鎖詳細(xì)介紹
- PHP使用flock實(shí)現(xiàn)文件加鎖的方法
- PHP session文件獨(dú)占鎖引起阻塞問(wèn)題解決方法
- PHP對(duì)文件進(jìn)行加鎖、解鎖實(shí)例
- PHP多進(jìn)程編程實(shí)例
- 深入探究PHP的多進(jìn)程編程方法
- PHP基于文件鎖解決多進(jìn)程同時(shí)讀寫(xiě)一個(gè)文件問(wèn)題示例
相關(guān)文章
用PHP實(shí)現(xiàn)多服務(wù)器共享SESSION數(shù)據(jù)的方法
用PHP實(shí)現(xiàn)多服務(wù)器共享SESSION數(shù)據(jù)的方法...2007-03-03PHP面向?qū)ο蟪绦蛟O(shè)計(jì)之類(lèi)常量用法實(shí)例
這篇文章主要介紹了PHP面向?qū)ο蟪绦蛟O(shè)計(jì)之類(lèi)常量用法,是PHP面向?qū)ο蟪绦蛟O(shè)計(jì)中非常重要的一個(gè)概念,對(duì)于PHP初學(xué)者來(lái)說(shuō)更是有必要加以牢固掌握,需要的朋友可以參考下2014-08-08PHP實(shí)現(xiàn)克魯斯卡爾算法實(shí)例解析
這篇文章主要介紹了PHP實(shí)現(xiàn)克魯斯卡爾算法實(shí)例解析,是PHP程序設(shè)計(jì)中一個(gè)比較經(jīng)典的應(yīng)用,需要的朋友可以參考下2014-08-08PHP Class self 與 static 異同與使用詳解
這篇文章主要介紹了PHP中 Class self 與 static 有什么區(qū)別,都怎么用,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-09-09php中time()與$_SERVER[REQUEST_TIME]用法區(qū)別
這篇文章主要介紹了php中time()與$_SERVER[REQUEST_TIME]用法區(qū)別,詳細(xì)分析了time()與$_SERVER[REQUEST_TIME]的用法,并以實(shí)例形式對(duì)比總結(jié)了二者在獲取當(dāng)前系統(tǒng)時(shí)間戳與請(qǐng)求時(shí)間戳的區(qū)別,需要的朋友可以參考下2014-11-11PHP 時(shí)間轉(zhuǎn)換Unix時(shí)間戳代碼
PHP 時(shí)間轉(zhuǎn)換Unix 時(shí)間戳實(shí)現(xiàn)代碼。2010-01-01php官方微信接口大全(微信支付、微信紅包、微信搖一搖、微信小店)
這篇文章主要介紹了php官方微信接口大全,包括微信支付、微信紅包、微信搖一搖、微信小店,感興趣的小伙伴們可以參考一下2015-12-12php連接odbc數(shù)據(jù)源并保存與查詢(xún)數(shù)據(jù)的方法
這篇文章主要介紹了php連接odbc數(shù)據(jù)源并保存與查詢(xún)數(shù)據(jù)的方法,涉及odbc數(shù)據(jù)源的操作技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2014-12-12