PHP块文件来自阅读

时间:2016-06-08 04:17:53

标签: php fopen fread flock

我正在尝试一种简单的算法:

File1:(lock.php)

  • 打开文件
  • 锁定文件,以便其他任何PHP文件都无法读取此文件
  • 睡觉
  • 释放锁定

File2:(lockstatus.php)

  • 尝试打开文件。
  • 如果没有打开
    • 等待锁定释放
  • 否则
    • 阅读文件

我的代码实现:

Lock.php

<?php
$f = fopen("key",'a');
if (flock($f, LOCK_EX | LOCK_NB)) {
    echo "File Locked. For Next 60 Seconds\n";
    sleep(60);
    var_dump(flock($f, LOCK_UN)); //release lock
    echo "lock released";
} else {
    echo "blocked";
}
?>

Lockstatus.php

<?php
do {
    echo "\n";
    $f = fopen("key",'a');
    if ($f) {
        echo "Readable\n";
        fclose ($f);
    } else {
        echo "Blocked! I am waiting\n";
        sleep(10);
    }
} while (!$f); //wait until fopen does not work
?>

问题: 即使已应用flockLockstatus.php也可以打开该文件。

问题:

Lockstatus.php锁定文件时,如何屏蔽Lock.php处的文件?

2 个答案:

答案 0 :(得分:2)

问题是flock()仅提供咨询锁定。另一个程序可能会完全忽略这一点并继续fopen和fread或其他任何东西。关键是在执行flock之后在Lockstatus.php中使用fopen来检查是否存在锁定。 Lockstatus.php中的flock会失败,然后您就会知道存在锁定。

答案 1 :(得分:1)

这个函数flock()在linux和windows上有不同的行为。

深入了解PHP文档中的“Notes”。这可能是你的问题。

flock on PHP Docs

之后,注意r +参数,读取+锁定是必需的。

$fp = fopen('/tmp/lock.txt', 'r+');

它不适用于 a