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);
?>
閱讀更多 IT生涯 的文章