2

看来,当php使用flock()获取一个文件的排他锁,然后使用pcntl_fork拆分成两个进程时,两个进程拥有相同的排他锁——也就是说,进一步调用flock($fd, LOCK_EX ) 在该文件句柄上返回 true。

但是,使用flock 的目的是防止两个进程同时写入同一个文件。那么 PHP 是如何处理这种情况的呢?它是否允许以某种方式都具有排他锁的两个进程发生冲突?一个进程是否有任何方法(无需创建新的文件处理程序)来检测另一个进程是否已释放锁?

这主要是学术好奇心。我知道这可以通过创建一个新的文件处理程序来处理,或者作为最后的手段使用 IPC 通知其他进程,但我想知道 flock 系统中是否有内置方法来检测锁的重复?

4

1 回答 1

1

flock在文件句柄级别上操作(在 PHP 术语中,在fopen级别返回的文件句柄资源上),因此当您分叉时,两个进程都将拥有锁,因为每个进程都有相同资源的副本。

关键flock是要防止同时访问,只要您不与另一个进程共享文件句柄,它就会这样做。因为分享是自愿的操作,不存在实际问题;如果您确实共享,则需要做出额外的安排,以保持锁的排他性。

在学术层面,虽然内核可以在你 fork 后检测到锁重复(毕竟,它知道你有一个与锁条目相关联的打开文件描述符),但实现使得它无法对它。

于 2014-04-07T08:57:25.930 回答