php文件锁-PHP实现文件锁加锁和解锁方法

本文主要介绍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文件锁,其他进程不会修改该文件。 文件解锁后才能进行操作。写法如下

锁文件夹怎么锁_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无法达到疗效。