6.2.10 用PHP处理文件的锁定
如果一个文件被某个用户的程序打开写入一些内容,同时,另外一个用户也打开这个文件,向其中写入数据,那么,文件的最终内容会是怎样的?哪个用户的程序写入的数据将被文件系统保存?还是两个写入的数据都会被保存?或者都没有被保存?在实际应用中,经常会碰到两个或多个用户程序同时读写一个文件等类似的问题。
为了解决这样的问题,保证文件中数据的完整有效,在操作文件时,需要对文件进行加锁操作。PHP通过函数flock完成对文件的锁定操作。该函数的语法如下所示。
bool flock($fp,int$operation[,int&wouldblock]);
该函数的第1个参数是文件的句柄;第2个参数表示锁定种类,它是一个常量;第3个参数是可选的,如果锁定会阻塞(即需要等待)的话,该参数设置为TRUE。如果成功锁定了文件,该函数会返回TRUE,否则返回FALSE。下面重点介绍一下函数flock()的第2个参数,它代表了锁定文件的种类,表6-2列举了参数$operation的可能取值。
代码6-12是一个对文件进行锁定的示例小程序。
代码6-12 对文件进行锁定6-12.php
01 <?php
02 $fp=fopen($_SERVER['DOCUMENT_ROOT']."/../data/lock_test.txt",'w');
03
04 flock($fp,LOCK_EX);//写锁定,独享锁定文件lock_test.txt
05 fwrite($fp,"Write Some Words……");
06 flock($fp,LOCK_UN);//释放对文件lock_test.txt的锁定
07
08 fclose($fp);
09 ?>
【代码解析】第4行使用参数LOCK_EX实现了对文件的独享锁定,使用锁定后,不要忘记再用参数LOCK_UN释放锁定,如第6行所示。
注意 如果在程序中,对某个文件操作时使用了函数flock()进行锁定,那么要对程序中所有对这个文件有操作的地方,使用函数flock()进行锁定。否则,锁定就无效。
共有条评论 网友评论