• 技术文章 >后端开发 >php教程

    文件读写顺序有关问题

    2016-06-13 11:17:10原创432
    文件读写顺序问题
    本帖最后由 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

    php入门到就业线上直播课:查看学习

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

    前端(VUE)零基础到就业课程:点击学习

    清晰的学习路线+老师随时辅导答疑

    自己动手写 PHP MVC 框架:点击学习

    快速了解MVC架构、了解框架底层运行原理

    专题推荐:nbsp filename file echo gt

    相关文章推荐

    • ❤️‍🔥共22门课程,总价3725元,会员免费学• ❤️‍🔥接口自动化测试不想写代码?• 你知道如何用PHP实现多进程吗• PHP与MySQL连接的方法总结• 工具包分享:PHP实现滑块验证图片• 求大神解答!ajax处理php返回的xml文档的问题• sql 当查询不到记录时返回的是什么
    1/1

    PHP中文网