现在的位置: 主页 > 主打产品 > 文章列表

php的咨询文件锁定:flock

作者:北京东方雨泽科技有限公司 来源:www.dfyz6789.com 发布时间:2017-09-06 09:45:03
 

php的咨询文件锁定:flock

最近因为工作的需要在研究php,碰到了一个问题,我使用如下代码锁定一个文件句柄


[php]
<?php
$filename = "/tmp/lock.txt";

$fp = fopen($filename, "r+");
if (!$fp) {
die("open failed.");
}

if (flock($fp, LOCK_EX)) { // 进行排它型锁定
sleep(20);
$count = (int)fgets($fp);
$count += 1;
fseek($fp, 0);
fwrite($fp, (string)$count);
fflush($fp); // flush output before releasing the lock
flock($fp, LOCK_UN); // 释放锁定
} else {
echo "Couldn't get the lock!";
}

fclose($fp);
?>

<?php
$filename = "/tmp/lock.txt";

$fp = fopen($filename, "r+");
if (!$fp) {
die("open failed.");
}

if (flock($fp, LOCK_EX)) { // 进行排它型锁定
sleep(20);
$count = (int)fgets($fp);
$count += 1;
fseek($fp, 0);
fwrite($fp, (string)$count);
fflush($fp); // flush output before releasing the lock
flock($fp, LOCK_UN); // 释放锁定
} else {
echo "Couldn't get the lock!";
}

fclose($fp);
?>
访问,采集软件,然后在sleep的20秒内尝试使用vi编辑/tmp/lock.txt,发现可以成功修改文件内容而不需要等待第一个脚本结束。经琢磨文档,发现这里有个概念叫"咨询文件锁定",就是说所有访问程序必须使用同一方式锁定才会生效, 否则它不会工作。

尝试使用如下代码在20秒内访问:


[php]
<?php
$filename = "/tmp/lock.txt";

$fp = fopen($filename, "r+");
if (!$fp) {
die("open failed.");
}

if (flock($fp, LOCK_EX)) { // 进行排它型锁定
$count = (int)fgets($fp);
echo $count;
$count += 1;
flock($fp, LOCK_UN); // 释放锁定
} else {
echo "Couldn't get the lock!";
}

fclose($fp);
?>

<?php
$filename = "/tmp/lock.txt";

$fp = fopen($filename, "r+");
if (!$fp) {
die("open failed.");
}

if (flock($fp, LOCK_EX)) { // 进行排它型锁定
$count = (int)fgets($fp);
echo $count;
$count += 1;
flock($fp, LOCK_UN); // 释放锁定
} else {
echo "Couldn't get the lock!";
}

fclose($fp);
?>

发现阻塞成功(第二个脚本需要等待第一个脚本结束才能继续运行)。

那么,可视化专题,什么叫同一种方式锁定呢?

A组:


1.尝试脚本1的flock参数修改为LOCK_SH,脚本2不变,试验,发现阻塞依然成功;

2.尝试脚本1和脚本2的flock参数都修改为LOCK_SH,发现脚本2会可以返回结果而不用等待脚本1执行结束;

B组:


1.尝试将脚本2的fopen参数修改为"r",现象同A组;

C组:

1.尝试将脚本2的flock参数修改为LOCK_SH,脚本1不变。

企业建站2800元起,携手武汉肥猫科技,做一个有见地的颜值派!更多优惠请戳:鄂州SEO http://ezhou.raoyu.net

  • 上一篇:Python网络编程概论 + UDP初步
  • 下一篇:最后一页
  •