php - PHP如何处理同一个独占锁的两个进程?

标签 php fork flock pcntl

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

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

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

最佳答案

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

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

在学术层面上,虽然内核有可能在您 fork 后检测锁重复(毕竟,它知道您有一个打开的文件描述符与一个锁条目相关联) , 实现使得无法对此采取任何措施。

关于php - PHP如何处理同一个独占锁的两个进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22907691/

相关文章:

linux - bash:在循环中创建许多描述符

php - 为什么我的文件在尝试使用 PHP 读取时总是为空?

python - 全局磁盘资源不可用

php - 将特殊字符转换为 HTML 实体

javascript - 菜单上下文

计算 fork() 代码中的进程总数

c - 主/从设备出现段错误

php - 为什么 "someString"== 0 在 PHP 中评估为真

php - 从 db mysql 获取单个值时出现问题

子级从 std 输入读取并写入 std 输出