为了确保操作的有效性和完整性,可以通过锁机制将并发状态转换成串行状态。作为锁机制中的一种,php的文件锁也是为了应对资源竞争。假设一个应用场景,在存在较大并发的情况下,通过fwrite向文件尾部多次有序的写入数据,不加锁的情况下会发生什么?多次有序的写入操作相当于一个事务,我们此时需要保证这个事务的完整性。
bool flock ( int handle, int operation [, int &wouldblock] );
flock() 操作的 handle 必须是一个已经打开的文件指针。operation 可以是以下值之一:
1.要取得共享锁定(读取程序),将 operation 设为 lock_sh(php 4.0.1 以前的版本设置为 1)
2.要取得独占锁定(写入程序),将 operation 设为 lock_ex(php 4.0.1 以前的版本中设置为 2)
3.要释放锁定(无论共享或独占),将 operation 设为 lock_un(php 4.0.1 以前的版本中设置为 3)
4.如果你不希望 flock() 在锁定时堵塞,则给 operation 加上 lock_nb(php 4.0.1 以前的版本中设置为 4)
建两个文件
代码如下
(1) a.php
?$file = “temp.txt”;
$fp = fopen($file , ‘w’);
if(flock($fp , lock_ex)){
fwrite($fp , “abcn”);
sleep(10);
fwrite($fp , “123n”);
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 为:
代码如下