本文主要介绍PHP实现文件锁的加锁和解锁操作的方式。 结合实例分析了PHP对文件的加锁、解锁操作的功能、实现方法以及相关注意事项。 有需要的同学可以参考以下
项目中通常会用到日志,比如数据库查询日志、访问日志、外部socket请求返回参数日志等。 处理日志时,简单的写法如下
$file = 'log.txt'; $fp = fopen($file, 'a+'); if(!is_writable($file)){ die("The $file is not writable!"); } fwrite($fp, 'here'); fclose($fp);
登录后复制
但这些写作方法都是有缺陷的。 一个网站不会同时被一个用户访问。 当多个用户同时访问时,就会出现问题php文件锁,即多个进程使用同一个资源时,前一个进程已进行到一半。 进程开始写入,所以最终生成的日志乱了。 在这些情况下,需要使用锁。 在文件被锁定期间php文件锁,其他进程不会修改该文件。 文件解锁后才能进行操作。写法如下
$file = 'log.txt'; $fp = fopen($file, 'a+'); if(!is_writable($file)){ exit("The $file is not writable!"); } flock($fp, LOCK_EX);// 加锁 fwrite($fp, 'here'); flock($fp, LOCK_UN);// 解锁 fclose($fp);
登录后复制
如果你想测试文件锁定期间其他进程无法操作该文件的情况,可以使用下面给出的demo
日志.php
$file = 'log.txt'; $fp = fopen($file, 'a+'); if(!is_writable($file)){ exit("The $file is not writable!"); } flock($fp, LOCK_EX); fwrite($fp, 'here'); sleep(10); flock($fp, LOCK_UN); fclose($fp);
登录后复制
测试.php
$file = 'lock.txt'; $fp = fopen($file, 'a'); fwrite($fp, 'good'); // 在sleep期间写不进去 fclose($fp); // 或是直接使用下面的这个例子,发现在sleep期间打印是个空值 //var_dump(file_get_contents($file));
登录后复制
测试时,先运行log.php,再运行test.php,会发现在sleep期间,test.php无法达到疗效。
发表评论