如何使用 PHP 在不锁定文件的情况下检查文件是否被锁定

问题描述 投票:0回答:1

我需要找到一种方法,使用 PHP 来检查文件是否被锁定而不锁定它。我想出了这段代码,效果很好,但它在尝试检查文件是否已锁定时锁定了文件。

$file_lock5 = fopen("file_lock5.txt","w");

if (!flock($file_lock5,LOCK_EX|LOCK_NB)) {

    //file is locked

}

上面代码的问题是我必须在它之后执行

fclose($file_lock5)
(或者让进程完成),否则文件将被锁定。我有数十个其他 PHP 进程已经在访问该文件(锁定、写入、解锁...),并且我不想锁定它只是为了检查它是否已锁定,因为同时其他进程可能会尝试获取锁定,并且会被拒绝因为上面的脚本不必要地锁定了它。

我只是想知道文件是否被锁定,之后我不需要写入/读取它 - 如果是这种情况,我将获得锁定以对其进行写入/读取。

知道如何使用 PHP 来实现这个吗?

php locking
1个回答
0
投票

不会抱怨太多,但这是一个棘手的问题 - 特别是因为

flock()
函数没有提供执行此操作的方法,然后它要么获取锁,要么只是等待锁被释放。

通过快速研究,实际上有一些您可以考虑的解决方案:

  1. 通过在非阻塞模式下使用

    flock()
    LOCK_NB
    ):因为你已经在代码中使用了
    LOCK_EX | LOCK_NB
    (我并不是说这是错误的,而是一个很好的方法),所以问题是,它不会尝试锁定文件本身,现在为了避免更改锁定状态,您可能需要一些其他方式和方法。

  2. 您可以检查文件的上次修改时间:如果您的进程正在更新文件的上次修改时间,则可能值得检查其时间戳以推断文件是否正在使用,这可能是一种间接方法(但不是 100%)在所有情况下都是可靠的)。

  3. 您可以使用单独的指示符文件甚至标志:现在,实际上,当进程锁定主文件时,它可能创建或更新分隔符指示符文件,其他进程也可以检查其存在或状态来决定主文件是否被锁定,这里的技巧是这种方法需要额外的逻辑,因为它需要弄清楚指标文件是否准确地反映了主文件的锁定状态。

  4. 用于锁定指示的数据库或共享内存:您可以使用数据库等共享资源,甚至可以使用共享内存(也许是 PHP 中的 APCu),这样您就可以记录锁定状态,每个进程都会更新此共享资源,以防万一当它获取或释放文件上的锁时。

  5. 自定义锁定机制的实现:通过依赖flock(),您就像之前所写的那样纯粹依赖该函数,可以实现使用数据库或基于文件的标记的机制,在这种特殊情况下,进程可以检查状态而不影响它。

现在,所有这些都有优点和缺点,正如我所说的,它很棘手(复杂性、可靠性、可移植性......),并且该方法纯粹基于应用程序架构和环境的具体情况(也许),你运行它(现在如果您想要为此定制答案,请给我们更多背景信息)。顺便提一句。如果是使用指示器文件或共享资源之类的自定义解决方案,则在处理边缘情况时必须非常非常小心(也许,如果持有锁的进程意外终止,则需要清理指示器)。

© www.soinside.com 2019 - 2024. All rights reserved.