<?php$fp = fopen("/tmp/lock.txt", "w+");if (flock($fp, LOCK_EX)) { // 进行排它型锁定
fwrite($fp, "Write something here\n");
flock($fp, LOCK_UN); // 释放锁定
} else {
echo "Couldn't lock the file !";
}fclose($fp);?>
以上是PHP手册里的例子啊,我运行了OK啊!
锁定文件,是进程锁定,页面执行完成,进程结束,不就不存在锁定了么!
fwrite($fp, "Write something here\n");
flock($fp, LOCK_UN); // 释放锁定
} else {
echo "Couldn't lock the file !";
}fclose($fp);?>
以上是PHP手册里的例子啊,我运行了OK啊!
锁定文件,是进程锁定,页面执行完成,进程结束,不就不存在锁定了么!
flock() 不能用于 NFS 以及其它一些网络文件系统。详细资料查看自己操作系统的文档。 在部分操作系统中 flock() 以进程级实现。当用一个多线程服务器 API(比如 ISAPI)时,可能不可以依靠 flock() 来保护文件,因为运行于同一服务器实例中其它并行线程的 PHP 脚本可以对该文件进行处理。 flock() 不支持旧的文件系统,如 FAT 以及它的派生系统。因此,此环境下总是返回 FALSE(尤其是对 Windows 98 用户来说)。
使用完锁后要释放锁,否则当然会出你那问题了!
$fp = fopen ('./data.txt',"a+");
$islock = flock ($fp, LOCK_EX); 锁定文件,只有本进程有权写入。
if($islock === false) //判断文件是否被锁定。
{
/*
去掉了一些处理不能锁定时的代码...
*/
echo 'NO!';
//fclose($fp);
}
else {
fwrite ($fp, "soming...\r");
//flock ($fp, LOCK_UN);
//fclose($fp);
echo 'OK!';
}
?>大家仔细看看我的问题,这段代码测试的目的是flock,当我执行xx.php后不解锁,不关文件。让另外的人接着访问xx.php,结果还是显示“OK!!!”,手册里不是说只有当前进程才有权吗?就是搞不懂写与不写flock有什么区别?
测试以下代码:
<?php$fp = fopen("lock.txt", "w+");if (flock($fp, LOCK_EX))
{
echo "lock the file 1 !";
if (flock($fp, LOCK_EX)){echo "<br>lock the file 2 !";}
}
if (flock($fp, LOCK_EX))
{
echo "<br>lock the file 3 !";
}
?>
结果:
lock the file 1 !
lock the file 2 !
lock the file 3 !
这是由PHP先天决定的。
用户A访问你的程序后,PHP在服务器端会启动一个线程,flock这个函数只能在当前线程中锁住这个文件。
同时,如果有另外的用户B也访问了这个程序,PHP会再启动一个线程 ,flock只对B的线程起作用.A和B之间互不影响。A此时,A线程对文件的锁定不影响 B对文件的操作!