主页 > 知识库 > 网络编程 > PHP >

PHP

php的咨询文件锁定:flock

来源:中国IT实验室 作者:佚名 发表于:2013-04-09 11:17  点击:
最近因为工作的需要在研究php,碰到了一个问题,我使用如下代码锁定一个文件句柄 [php] ?php $filename = /tmp/lock.txt; $fp = fopen($filename, r+); if (!$fp) { die(open failed.); } if (flock($fp, LOCK_EX)) { // 进行排它型锁定 sleep(
最近因为工作的需要在研究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不变。

    有帮助
    (0)
    0%
    没帮助
    (0)
    0%