模擬flock實(shí)現(xiàn)文件鎖定
更新時間:2007年02月14日 00:00:00 作者:
主要提供了一種思路。
$lock0和$lock1就是文件鎖定的標(biāo)識符,當(dāng)文件被某一用戶打開的時候,$lock0和$lock1就會產(chǎn)生,當(dāng)該文件沒打開則不存在。
其實(shí)最關(guān)鍵就是有個標(biāo)識符來表示當(dāng)前這個文件的狀態(tài), $lock0和$lock1就是起這樣的作用。
<?php
// Lock a file, timing out if it takes too long.
function lock ($lock, $tries) {
$lock0 = ".{$lock}0";
$lock1 = ".{$lock}1";
for ($i=0; $i<$tries; $i++) {
if (!is_file($lock0)) {
touch($lock0);
if (!is_file($lock1)) {
touch($lock1);
return 1;
}
}
usleep(100);
}
return 0;
}
// Unlock a file.
function unlock ($lock) {
unlink(".{$lock}1");
unlink(".{$lock}0");
}
// Usage example.
$filename = "somefile";
$data = "stuff and thingsn";
$tries = 10;
if (lock($filename, $tries)) {
$h = fopen($filename, "a") or die();
fwrite($h, $data);
fclose($h);
/**
* 另外一個進(jìn)程寫文件,檢查是否鎖定
*/
if (lock($filename, $tries)) {
$h2 = fopen($filename, "a") or die();
fwrite($h2,'check lock');
fclose($h2);
}else{
//die("Failed to lock $filename after ".($tries*100)." milliseconds!";
}
unlock($filename);
} else {
//die("Failed to lock $filename after ".($tries*100)." milliseconds!";
}
?>
$lock0和$lock1就是文件鎖定的標(biāo)識符,當(dāng)文件被某一用戶打開的時候,$lock0和$lock1就會產(chǎn)生,當(dāng)該文件沒打開則不存在。
其實(shí)最關(guān)鍵就是有個標(biāo)識符來表示當(dāng)前這個文件的狀態(tài), $lock0和$lock1就是起這樣的作用。
復(fù)制代碼 代碼如下:
<?php
// Lock a file, timing out if it takes too long.
function lock ($lock, $tries) {
$lock0 = ".{$lock}0";
$lock1 = ".{$lock}1";
for ($i=0; $i<$tries; $i++) {
if (!is_file($lock0)) {
touch($lock0);
if (!is_file($lock1)) {
touch($lock1);
return 1;
}
}
usleep(100);
}
return 0;
}
// Unlock a file.
function unlock ($lock) {
unlink(".{$lock}1");
unlink(".{$lock}0");
}
// Usage example.
$filename = "somefile";
$data = "stuff and thingsn";
$tries = 10;
if (lock($filename, $tries)) {
$h = fopen($filename, "a") or die();
fwrite($h, $data);
fclose($h);
/**
* 另外一個進(jìn)程寫文件,檢查是否鎖定
*/
if (lock($filename, $tries)) {
$h2 = fopen($filename, "a") or die();
fwrite($h2,'check lock');
fclose($h2);
}else{
//die("Failed to lock $filename after ".($tries*100)." milliseconds!";
}
unlock($filename);
} else {
//die("Failed to lock $filename after ".($tries*100)." milliseconds!";
}
?>
相關(guān)文章
PHP消息隊(duì)列實(shí)現(xiàn)及應(yīng)用詳解【隊(duì)列處理訂單系統(tǒng)和配送系統(tǒng)】
這篇文章主要介紹了PHP消息隊(duì)列實(shí)現(xiàn)及應(yīng)用,結(jié)合實(shí)例形式詳細(xì)分析了php消息隊(duì)列的概念、原理及隊(duì)列處理訂單系統(tǒng)和配送系統(tǒng)案例,需要的朋友可以參考下2019-05-05PHP依賴注入(DI)和控制反轉(zhuǎn)(IoC)詳解
這篇文章主要介紹了PHP依賴注入(DI)和控制反轉(zhuǎn)(IoC)的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-06-06解析php中session的實(shí)現(xiàn)原理以及大網(wǎng)站應(yīng)用應(yīng)注意的問題
本篇文章是對php中session的實(shí)現(xiàn)原理以及大網(wǎng)站應(yīng)用應(yīng)注意的問題進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06