欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

文件读写顺序有关问题

程序员文章站 2022-06-06 14:54:04
...
文件读写顺序问题
本帖最后由 o911016 于 2013-03-13 12:45:07 编辑

function read($filename) {
$fp = fopen($filename, 'rb');
flock($fp, LOCK_SH);
$data = @fread($fp, @filesize($filename));
fclose($fp);
return $data;
}
function write($filename, $data) {
$fp = fopen($filename, 'ab');
flock($fp, LOCK_EX);
fwrite($fp, $data);
fclose($fp);
return mt_rand(1, 999);
}

$file = './wr.txt'; //原文件是空的
echo 'r1: ', read($file), '|
';
echo 'w1: ', write($file, 'a'), '|
';
echo 'r2: ', read($file), '|
';
echo 'w2: ', write($file, 'b'), '|
';
echo 'r3: ', read($file), '|
';

?>


实际执行之后的结果:
r1: |
w1: 745|
r2: |
w2: 404|
r3: |


根据结果发现,执行顺序和PHP语句的顺序不同,
实际上的顺序是“r1 -> r2 -> r3 -> w1 -> w2”。
我试过把读文件所加的锁LOCK_SH改成LOCK_EX,结果还是和上面的顺序一样。

怎样才能让读写顺序符合语句顺序“r1 -> w1 -> r2 -> w2 -> r3”来执行?

------解决方案--------------------
本帖最后由 xuzuning 于 2013-03-13 12:56:42 编辑 真正的原因是文件状态缓存造成 filesize($filename) 始终为 0
function read($filename) {
$fp = fopen($filename, 'rb');
flock($fp, LOCK_SH);
clearstatcache(); //清除文件状态缓存
$data = @fread($fp, @filesize($filename));
fclose($fp);
return $data;
}
function write($filename, $data) {
$fp = fopen($filename, 'ab');
flock($fp, LOCK_EX);
fwrite($fp, $data);
fclose($fp);
return $data;//mt_rand(1, 999);
}

$file = './wr.txt'; //原文件是空的
file_put_contents($file, ''); //清空源文件
echo 'r1: ', read($file), '
------解决方案--------------------

';
echo 'w1: ', write($file, 'a'), '
------解决方案--------------------

';
echo 'r2: ', read($file), '
------解决方案--------------------

';
echo 'w2: ', write($file, 'b'), '
------解决方案--------------------

';
echo 'r3: ', read($file), '
------解决方案--------------------

';
readfile($file); //显示一下
r1:
------解决方案--------------------

w1: a
------解决方案--------------------

r2: a
文件读写顺序有关问题

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。

相关文章

相关视频


网友评论

文明上网理性发言,请遵守 新闻评论服务协议

我要评论
  • 文件读写顺序有关问题
  • 专题推荐

    作者信息
    文件读写顺序有关问题

    认证0级讲师

    推荐视频教程
  • 文件读写顺序有关问题javascript初级视频教程
  • 文件读写顺序有关问题jquery 基础视频教程
  • 视频教程分类