模拟flock实现文件锁定
作者:bea
主要提供了一种思路。 $lock0和$lock1就是文件锁定的标识符,当文件被某一用户打开的时候,$lock0和$lock1就会产生,当该文件没打开则不存在。 其实最关键就是有个标识符来表示当前这个文件的状态,$lock0和$lock1就是起这样的作用。 代码如下: <?php //Lockafile,timingoutifittakestoolong. functionlock($lock,$tries){ $lock0=".{$lock}0"; $lo
主要提供了一种思路。
$lock0和$lock1就是文件锁定的标识符,当文件被某一用户打开的时候,$lock0和$lock1就会产生,当该文件没打开则不存在。
其实最关键就是有个标识符来表示当前这个文件的状态, $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);
/**
* 另外一个进程写文件,检查是否锁定
*/
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就是文件锁定的标识符,当文件被某一用户打开的时候,$lock0和$lock1就会产生,当该文件没打开则不存在。
其实最关键就是有个标识符来表示当前这个文件的状态, $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);
/**
* 另外一个进程写文件,检查是否锁定
*/
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!";
}
?>
有用 | 无用
猜你喜欢
您可能感兴趣的文章:
- 如何提高PHP速度
- 隐藏X-Space个人空间下方版权方法隐藏X-Space个人空间标题隐藏X-Space个人空间管理版权方法
- excellent!——ASCII Art(由目标图象生成ascii)
- 珊瑚虫IP库浅析
- PHP中HTTP方式下的Gzip压缩传输方法举偶
- PHP+.htaccess实现全站静态HTML文件GZIP压缩传输(一)
- php调用mysql存储过程
- mysql中存储过程、函数的一些问题
- 让PHP支持页面回退的两种方法[转]
- 浅析PHP水印技术
- 解决GD中文乱码问题
- 使用apache模块rewrite_module (转)
- 谈谈PHP的输入输出流
- 修改了一个很不错的php验证码(支持中文)
- PHP数据缓存技术
- 再次研究下cache_lite
- cache_lite试用
- 几篇关于无限分类算法的文章
- 一个捕获函数输出的函数