PHP阻止文件读取

PHP阻止文件读取,php,fopen,fread,flock,Php,Fopen,Fread,Flock,我正在尝试一个简单的算法,它说: 文件1:(lock.php) 打开一个文件 锁定该文件,以便其他PHP文件无法读取该文件 睡眠 释放锁 文件2:(lockstatus.php) 尝试打开该文件 如果没有打开 等待锁释放 否则 读文件 我的代码实现: Lock.php: <?php $f = fopen("key",'a'); if (flock($f, LOCK_EX | LOCK_NB)) { echo "File Locked. For Next 60 Sec

我正在尝试一个简单的算法,它说:

文件1:(lock.php)

  • 打开一个文件
  • 锁定该文件,以便其他PHP文件无法读取该文件
  • 睡眠
  • 释放锁
文件2:(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
?>

问题: 即使应用了
flock
Lockstatus.php
也可以打开该文件

问题:

当文件被
Lock.php
锁定后,如何在
Lockstatus.php
处阻止文件读取?

此函数flock()在linux和windows上具有不同的行为

深入查看PHP文档上的“注释”。这可能是你的问题

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

$fp = fopen('/tmp/lock.txt', 'r+');
它不适用于a

此函数flock()在linux和windows上的行为不同

深入查看PHP文档上的“注释”。这可能是你的问题

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

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

它不适用于a

问题是
flock()
只提供建议性锁定。另一个程序可能会完全忽略这一点,并继续执行fopen和fread或其他任何程序。关键是在执行
fopen
检查是否存在现有锁后,在Lockstatus.php中使用
flock
flock将失败,然后您将知道存在一个现有锁。

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

我正在使用Linux。因此,我想它应该适用于我的情况。让它成为“r+”,但它不起作用。请看文档的第一条评论:“flock函数遵循同名Unix系统调用的语义。flock仅使用建议锁定;也就是说,其他进程可能完全忽略锁定;它只影响调用flock调用的进程。”我使用的是Linux。因此,我想它应该适用于我的情况。并将其设置为“r+”,但是,它不起作用。请看文档上的第一条注释:“flock函数遵循具有相同名称的Unix系统调用的语义。flock仅使用建议锁定;也就是说,其他进程可能完全忽略锁定;它只影响调用flock调用的进程。”