php中讀寫文件時鎖的使用

php中很多函數在win32的情況下使用經常出現兼容性的問題,其中flock就是其中一個。

函數: flock(file,lock,block)

參數描述file必需。規定要鎖定或釋放的已打開的文件。lock必需。規定要使用哪種鎖定類型。block可選。若設置為 1 或 true,則當進行鎖定時阻擋其他進程。

flock() 操作的 file 必須是一個已經打開的文件指針。

lock 參數可以是以下值之一:

  • 要取得共享鎖定(讀取的程序),將 lock 設為 LOCK_SH(PHP 4.0.1 以前的版本設置為 1)。
  • 要取得獨佔鎖定(寫入的程序),將 lock 設為 LOCK_EX(PHP 4.0.1 以前的版本中設置為 2)。
  • 要釋放鎖定(無論共享或獨佔),將 lock 設為 LOCK_UN(PHP 4.0.1 以前的版本中設置為 3)。
  • 如果不希望 flock() 在鎖定時堵塞,則給 lock 加上 LOCK_NB(PHP 4.0.1 以前的版本中設置為 4)。

被 lock_ex 後的文件 再以read模式 fopen 的話將讀到空內容!!!

如果沒有判斷就把它當作空做操作後再寫入就出錯啦….

test1.php

以下是代碼片段:

$fd = fopen(”./test.txt”, ”w”);

flock($fd, LOCK_EX);

sleep(20);

fwrite($fd, ”good”);

flock($fd, LOCK_UN);

fclose($fd);

?>

test2.php

以下是代碼片段:

$fd = fopen(”./test.txt”, ”r”);

echo fread($fd, 512);

fclose($fd);

?>test3.php

以下是代碼片段:

$fd = fopen(”./test.txt”,”r”);

flock($fd,LOCK_EX);

echo fread($fd,512);

flock($fd,LOCK_UN);

fclose($fd);

?>

執行test1.php,然後執行test2.php,發現test2.php立即運行完成,內容為空。

執行test1.php,然後執行test3.php,發現test3.php會在test1.php執行之後獲得內容。

貌似在使用fread的時候都必須使用flock,否則這個時候內容可能為空。

在PHP中經常會把數據庫中的內容,通過php生成緩存文件,來減少數據庫的負載壓力。

以下是代碼片段:

function writeCache(){}

function getCache(){

//加鎖read

}

if(!getCache)

{

//執行SQL語句,然後再寫入緩存

}

在php中fread的效率遠高於fwrite的效率,因此在併發能力較大的情況下,緩存過期,導致大量請求到達後端Mysql上面可能會導致down機的情況發生,如何避免這種情況呢?當然,你可以採用memecached的主從緩存 ,通過時間切換來更新主從緩存的方式實現。

以下是代碼片段:

function phpflock($dir)

{

$dir = md5($dir).’.php’;

flock($dir,LOCK_EX);

}

function phpunlock($dir)

{

$dir = md5($dir).’.php’;

flock($dir,LOCK_UN);

}

$dir =’/test.php’;

phplock(dir);

if(!getcache())

{

writeCache($dir);

}

phpunlock($dir);

?>


分享到:


相關文章: