文件读写顺序问题

php中文网
发布: 2016-06-23 14:02:45
原创
1094人浏览过

<?phpfunction 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),       '|<br/>';echo 'w1: ', write($file, 'a'), '|<br/>';echo 'r2: ', read($file),       '|<br/>';echo 'w2: ', write($file, 'b'), '|<br/>';echo 'r3: ', read($file),       '|<br/>';?>
登录后复制


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


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

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

字狐AI
字狐AI

由GPT-4 驱动的AI全能助手,支持回答复杂问题、撰写邮件、阅读文章、智能搜索

字狐AI 26
查看详情 字狐AI

回复讨论(解决方案)

真正的原因是文件状态缓存造成 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),    '|<br/>';echo 'w1: ', write($file, 'a'),    '|<br/>';echo 'r2: ', read($file),    '|<br/>';echo 'w2: ', write($file, 'b'),    '|<br/>';echo 'r3: ', read($file),    '|<br/>';readfile($file); //显示一下
登录后复制
r1: |
w1: a|
r2: a|
w2: b|
r3: ab|
ab


clearstatcache -- 清除文件状态缓存

本函数缓存特定文件名的信息,因此只在对同一个文件名进行多次操作并且需要该文件信息不被缓存时才需要调用 clearstatcache()。 

受影响的函数包括 stat(),lstat(),file_exists(),is_writable(),is_readable(),is_executable(),is_file(),is_dir(),is_link(),filectime(),fileatime(),filemtime(),fileinode(),filegroup(),fileowner(), filesize(),filetype() 和 fileperms()。

明白了,原来是缓存的缘故。

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号