【问题标题】:How to lock a file against external processes如何针对外部进程锁定文件
【发布时间】:2015-12-21 09:32:25
【问题描述】:

我需要创建一个不能被其他脚本或进程删除的锁定文件。我试过这个:

    $f = fopen($pidFile, 'w');
    fwrite($f, getmypid());
    flock($f, LOCK_EX);

但是从当前用户启动的任何其他进程都可以删除$f 文件,即使文件句柄仍然被正在运行的脚本打开。如何解决这个问题并防止其他人(即非PHP进程)删除文件?进程退出时自动释放锁?所有类似的问题都以 RTMflock() 结尾,但没有一个回答如何针对外部进程锁定文件。

操作系统是Linux 2.6.32-431.el6.x86_64

【问题讨论】:

  • flock 是“建议性的”,并不严格。在对脚本中的文件进行任何操作之前,请使用 additional check。如果它是关于您自己的 PHP 脚本,这将起作用。如果是关于外部进程 - 那么flock 无法保存案例。
  • 正如我在问题中提到的,我需要锁定文件以防止从外部进程中删除(即非 PHP)

标签: php file-locking


【解决方案1】:

flock 在 Linux 上默认使用“建议锁定”,这意味着它不会阻止任何其他进程操作该文件。请参阅 PHP 手册中的注释。

flock() 在 Windows 上使用强制锁定而不是建议锁定。通过 fcntl() 系统调用支持的常用机制,基于 Linux 和 System V 的操作系统也支持强制锁定:也就是说,如果相关文件设置了 setgid 权限位并清除了组执行位。在 Linux 上,还需要使用 mand 选项挂载文件系统才能正常工作。

另见https://www.kernel.org/doc/Documentation/filesystems/mandatory-locking.txt

通过在文件模式中设置 group-id 位但删除 group-execute 位,文件被标记为强制锁定的候选者。这是一个否则 无意义的组​​合,并且由 System V 实现者选择,以免 破坏现有的用户程序。

请注意,group-id 位通常由内核自动清除 一个 setgid 文件被写入。这是一种安全措施。内核已经 修改以识别强制锁定候选的特殊情况并 不要清除该位。同样内核也没有修改 以 setgid 权限运行强制锁定候选。

还要注意警告:

即使是 root 也不能​​覆盖强制锁,因此失控的进程可能会发生 如果他们锁定关键文件,则会造成严重破坏。解决方法是更改​​文件 尝试读取或写入之前的权限(删除 setgid 位)。

【讨论】:

  • 感谢您的解释。但是如何在 PHP 中实现这个来解决我的问题呢?
  • @AlexanderPravdin 试试books.google.de/…
  • 谢谢,但是flock() 函数不会针对外部进程锁定文件(我可以看到本书中的解释)。但是第 249 页及以后的页面是隐藏的,需要购买。
  • @AlexanderPravdin 不确定,php.net/manual/en/function.dio-fcntl.php 可能是可能的,但不要相信我的话。更好的选择可能是该书中解释的文件交换。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-29
相关资源
最近更新 更多