zoukankan      html  css  js  c++  java
  • php 文件锁

    当写为LOCK_EX锁 且 读为LOCK_SH锁时最为妥当,经测试,这时情况如下:

    1, 先运行w.php,马上支行r.php 后 程序会先等写入后再读取

    2, 先运行r.php,再马上支行w.php后 当写操作执行LOCK_EX时就已经把文件内容清空,LOCK_SH并不会影响写操作清空,也就是说具体流程如下: 

      a) 运行r.php ,加LOCK_SH锁 , 马上支行w.php,加LOCK_SH,文件被清空

         b) 等待r.php读出为空,运行完毕后,w.php再开始运行,完毕

    3,如果将第二步中的w.php中的 fwrite换成a就可以先读出原有的,等读完后,写才执行

    4,如果两个都读 或都写,那么就按 先后顺序等待执行

    其中很像队列机制

    最后解决办法,在同一锁内读后再写,可以解决并发冲突:

    <?php
    @ini_set('implicit_flush',1);
    ob_implicit_flush(1);
    @ob_end_clean();


    $file = "temp.txt";
    $fp = fopen($file, 'r+');
    flock($fp, LOCK_EX) or die("lock error");

    echo '<br />LOCK_EX 哥先读5s....';

    for ($i=5; $i>0; --$i)
    {
    echo $i;
    sleep(1);
    }

    echo '<br />'.fread($fp, 100);
    echo '<br /> 被读了出来 ,LOCK_UN';

    fwrite($fp ,'#'); //然后指针到文件尾,此时再写入文件尾部
    echo '<br />#';
    flock($fp, LOCK_UN);
    fclose($fp);
    ?>

    --------------以上是把在文件末尾加新写入的内容----------------
    有的时候我们需要将写入的内容写在文件头(当然由于指针问题会覆盖):
    <?php
    //计算文件大小
    echo filesize('temp.txt');
    $fp = fopen('temp.txt', 'r+');

    flock($fp, LOCK_EX);
    fwrite($fp, '10001');
    sleep(2);
    $str = fread($fp , 1024 * 100);
    echo 'content : ' . $str;


    flock($fp, LOCK_UN);
    ?>
    这时候的好处是文件的大小不会变大,方便打开和读取,我在计算幸运数据为减轻服务器压力就是这样写的
  • 相关阅读:
    学习使用资源文件[4] 用资源中的图片做背景、使用 LoadFromResourceID
    WinAPI: ShellExecute 打开外部程序或文件
    学习使用资源文件[8] 关于 HInstance
    学习使用资源文件[3] 用 Image 显示资源中的图片
    薛定谔之猫_百度百科
    美国创业公司招聘工程师
    Two star programming
    vector 自定义排序
    Data Structures, Algorithms, & Applications in Java Suffix Trees
    Three Star Programmer
  • 原文地址:https://www.cnblogs.com/yubolin/p/6056454.html
Copyright © 2011-2022 走看看