2015-12-21 99 views
7

我需要创建一个不能被其它脚本或程序被删除锁定文件的文件。我尝试这样做:如何锁定对外部进程

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

但任何其他进程从当前用户开始可以删除,即使文件句柄仍然由行书打开$f文件。如何解决这个问题,并防止其他人(即非PHP进程)删除该文件?当进程退出时锁会自动释放?所有类似的问题都以RTM flock()结尾,但他们都没有回答如何锁定文件以抵御外部进程。

OS是Linux 2.6.32-431.el6.x86_64

+2

'flock'是 “顾问”,不严格。使用[附加检查](http://stackoverflow.com/questions/20771824/php-test-if-file-is-locked),然后再对脚本中的任何文件进行处理。如果是关于你自己的PHP脚本的话,这将起作用。如果是关于外部过程 - 那么'flock'不能保存案例。 –

+1

正如我在我的问题提到的,我需要锁定文件,以防止外部进程删除(即非PHP太) –

回答

5

flock Linux上默认的,这意味着它不能阻止任何其它进程操纵该文件使用“咨询锁定”。请参阅PHP手册中的说明。

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

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

的文件被标记为用于强制闭锁的候选通过将组ID位在其文件模式,但除去所述基团的执行位。这是一个否则 无意义组合,并且选择由系统V实施者以免 打破现有用户程序。

注意,组ID位通常是自动由内核时 一个setgid的文件写入清除。这是一项安全措施。内核已经 修改承认强制锁候选人的特殊情况和 副歌从清除此位。同样,内核已被修改为不是 以运行具有setgid特权的强制锁定候选项。

而且介意警告:

甚至没有根可以覆盖强制锁,所以失控的进程可以发泄 破坏,如果他们锁定的重要文件。解决方法是在尝试读取或写入文件之前更改文件 权限(删除setgid位)。

+1

谢谢你的解释。但如何在PHP中实现这个解决我的问题? –

+0

@AlexanderPravdin尝试https://books.google.de/books?id = mCpnlNYzqOQC&lpg = PA247&ots = qAWSgskqZ6&dq = mandatory%20file%20locking%20php&hl = de&pg = PA246#v = onepage&q = mandatory%20file%20locking%20php&f = false – Gordon

+0

谢谢,但flock()函数不会锁定外部进程(因为我可以看到本书中解释的内容)。但是从249页开始,更进一步被隐藏起来,需要购买这本书。 –