【问题标题】:Why can PHP still read/write to this locked file?为什么 PHP 仍然可以读/写这个锁定的文件?
【发布时间】:2016-04-01 16:13:19
【问题描述】:

我无法准确理解flock()ed 文件的锁定程度。我正在锁定一个简单的文本文件,如下所示:

// file_lock.php

$filename = "data.txt";
$delay = 5;

$lock = fopen($filename, "w");
if ($lock === FALSE || !flock($lock, LOCK_EX | LOCK_NB, $block) || $block) {
    echo "ERROR:  Can not open or lock " . $filename . "\n";
    sleep($delay);
}
else {
    echo "SUCCESS: " . $filename . " locked.\n";
    sleep($delay);
    flock($lock, LOCK_UN);
    echo $filename . " unlocked\n";
}

然后,从另一个脚本,我检查文件 is_writable() / is_readable()

// test.php

$filename = "data.txt";

if (is_readable($filename)) echo "File is readable\n";
else echo "File is not readable\n";

if (is_writable($filename)) echo "File is writable\n";
else echo "File is not writable\n";

但是当我运行它们时,它们都认为自己有访问权限:

$ php file_lock.php & php test.php
SUCCESS: data.txt locked.
File is readable
File is writable
data.txt unlocked

文档herehere 的细节非常少,我错过了什么?我是否错误地使用了羊群?函数is_readable()is_writable() 是否会检查无关的内容以确定读/写能力?

【问题讨论】:

  • 只是好奇,您是否尝试过在 test.php 脚本中实际写入文件?
  • 是否可读/可写是 IIRC 纯粹的权限检查,它们不检查文件的锁定状态?
  • @Tom 我没有尝试与文件进行实际交互,我认为它不会工作,因为文件应该被锁定。
  • @Mark 我没想到,我会测试一下。
  • is_readable()/is_writeable 仅检查文件的权限。如果不先打开文件,您将无法获取文件的锁定或检查其锁定状态。

标签: php file-locking


【解决方案1】:

文档遗漏了很多细节,但它们确实包含了is_readable()is_writable() 上的一个重要细节:

注意:此函数的结果会被缓存。见clearstatcache() 了解更多详情。

在调用is_readable() 之前,您需要针对该文件或目录运行clearstatcache() 以查看最新信息。

【讨论】:

  • 添加了这个,同样的问题。正如 Mark 在上面猜测的那样,这似乎是一个权限问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多