bool flock ( int handle, int operation [, int &wouldblock] );
flock() 操做的 handle 必須是一個已經打開的文件指針。operation 能夠是如下值之一:php
建兩個文件
(1) a.phphtml
$file
=
"temp.txt"
;
$fp
=
fopen
(
$file
,
'w'
);
if
(
flock
(
$fp
, LOCK_EX)){
fwrite(
$fp
,
"abc\n"
);
sleep(10);
fwrite(
$fp
,
"123\n"
);
flock
(
$fp
, LOCK_UN);
}
fclose(
$fp
);
|
(2) b.php數據庫
$file
=
"temp.txt"
;
$fp
=
fopen
(
$file
,
'r'
);
echo
fread
(
$fp
, 100);
fclose(
$fp
);
|
運行 a.php 後,立刻運行 b.php ,能夠看到輸出:
abc
等 a.php 運行完後運行 b.php ,能夠看到輸出:
abc
123
顯然,當 a.php 寫文件時數據太大,致使時間比較長時,這時 b.php 讀取數據不完整緩存
修改 b.php 爲:測試
$file
=
"temp.txt"
;
$fp
=
fopen
(
$file
,
'r'
);
if
(
flock
(
$fp
, LOCK_EX)){
echo
fread
(
$fp
, 100);
flock
(
$fp
, LOCK_UN);
}
else
{
echo
"Lock file failed...\n"
;
}
fclose(
$fp
);
|
運行 a.php 後,立刻運行 b.php ,能夠發現 b.php 會等到 a.php 運行完成後(即 10 秒後)才顯示:
abc
123
讀取數據完整,但時間過長,他要等待寫鎖釋放。spa
修改 b.php 爲:指針
$file
=
"temp.txt"
;
$fp
=
fopen
(
$file
,
'r'
);
if
(
flock
(
$fp
, LOCK_SH | LOCK_NB)){
echo
fread
(
$fp
, 100);
flock
(
$fp
, LOCK_UN);
}
else
{
echo
"Lock file failed...\n"
;
}
fclose(
$fp
);
|
運行 a.php 後,立刻運行 b.php ,能夠看到輸出:
Lock file failed…
證實能夠返回鎖文件失敗狀態,而不是向上面同樣要等好久。code
結論:
建議做文件緩存時,選好相關的鎖,否則可能致使讀取數據不完整,或重複寫入數據。
file_get_contents 好像選擇不了鎖,不知道他默認用的什麼鎖,反正和不鎖獲得的輸出同樣,是不完整的數據。
我是要作文件緩存,因此只須要知道是否有寫鎖存在便可,有的話就查數據庫就能夠了。
測試環境:Linux(Ubuntu 6) , PHP 5.1.2 , Apache 2htm
再轉:blog
還有一篇也寫得不錯的博文:
http://hxsdit.com/1110