php 使用flock解决文件并发读写冲突的问题

时间:2016-08-16
在文件读写过程中,可能会被多个人读写操作,这个时候我们需要考虑一个问题,在文件进行并发操作时,如果不对文件的访问进行相应的独占,就容易造成数据丢失,而flock函数正好可以解决文件并发操作的问题。

为了确保操作的有效性和完整性,可以通过锁机制将并发状态转换成串行状态。作为锁机制中的一种,PHP的文件锁也是为了应对资源竞争。假设一个应用场景,在存在较大并发的情况下,通过fwrite向文件尾部多次有序的写入数据,不加锁的情况下会发生什么?多次有序的写入操作相当于一个事务,我们此时需要保证这个事务的完整性。

高效且保护文件在使用过程中受保护的写法是这样的【推荐】:

$fp = fopen('product.csv', 'cb');
flock($fp, LOCK_EX | LOCK_NB);
fwrite($fp, "title1, title2\n");
//fputcsv($fp, array('title1', 'title2'));
for($p = 1; $p <= 100000; $p++){
	fwrite($fp, "content1, content2\n");
	//fputcsv($fp, array('content1', 'content2'));
}
/* http://www.manongjc.com/article/1358.html */
flock($fp, LOCK_UN);
fclose($fp);