当前位置: 首页 > 知识库问答 >
问题:

PHP如何处理具有相同独占锁的两个进程?

柳威
2023-03-14

当php使用flock()获取文件的独占锁,然后使用pcntl_fork将其拆分为两个进程时,两个进程都具有相同的独占锁——也就是说,对该文件句柄的flock($fd,lock_EX)的进一步调用返回true。

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

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

共有1个答案

伏建修
2023-03-14

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

flock的要点是防止同时访问,只要您不与其他进程共享文件句柄,它就会这样做。因为分享是一个自愿的行动,这不是一个实际问题;如果您确实共享,您需要进行额外的安排,以便保持锁的排他性。

在学术层面,虽然内核可以在你分叉后检测到锁复制(毕竟,它知道你有一个与锁条目相关联的打开文件描述符),但实现使得对此做些什么是不可能的。

 类似资料:
  • 问题内容: 说我有一个类似的代码: 我应该是完全合格的班级名称吗?我可以摆脱导入声明吗?这种情况在现实世界编程中是否常见? 问题答案: 你可以忽略导入语句,并使用整个路径引用它们。例如: 但是我要说的是,使用两个具有相同名称和类似功能的类通常不是最好的主意,除非你能真正弄清是哪个。

  • 问题内容: 我创建了两个列表和,但是每个列表都有不同的创建方法: 但是输出使我感到惊讶: 使用列表推导创建的列表在内存中更大,但是在Python中这两个列表相同。 这是为什么?这是CPython内部的东西,还是其他解释? 问题答案: 在编写时,Python知道它将需要一个正好包含10个对象的列表,因此它会精确地分配该对象。 当您使用列表推导时,Python不知道它需要多少。因此,随着元素的添加,列

  • 在分布式Java桌面应用程序通过JDBC访问的特别请求的DB2表中,我每天都会多次收到以下场景: > 客户机A想要插入新的寄存器,并在表上获得一个IX锁,X锁在每个新行中; 其他客户端想要执行SELECT,被授予表上的IS锁,但应用程序卡住了; 客户机A继续工作,但是插入和更新查询没有被提交,锁没有被释放,并且它继续收集X个锁到每一行; 客户端 A 退出,其工作未提交。其他客户端最终获取其 SEL

  • 我有一个PDF文件,其中包含一个表单,其中的字段具有相同的字段名。这是为了共享文档中的数据而做的。例如,我有合同,此文档的每一页都必须有公司名称,我将公司名称写在一个表单字段中,并将其复制到当前文档的所有页面,但是当我尝试使用库阅读此文档时,我没有得到此数据,因为只创建一个字段名为的字段,而另一个字段名为clean。 如何使用库读取具有相同字段名称的字段?

  • 问题内容: 我有两个数组:一个数组填充了来自ajax请求的信息,另一个数组存储了用户单击的按钮。我使用以下代码(我填写了示例编号): 但是,即使两个数组相同,但名称不同,它总是给出。(我在Chrome的JS控制台中对此进行了检查)。那么,有什么办法可以知道这两个数组是否包含相同的数组?为什么给?我怎么知道第一个数组中的哪个值不在第二个数组中? 问题答案: 请注意,这不会像以前的答案那样修改原始数组

  • 我在第一个事务中运行以下查询: 然后是第二个,来自不同的连接,这是完全相同的。在,它正在等待。 然后我运行下面的代码来查看锁 它显示行锁(ROW SHARE,ROW EXCLUSVE),这很好。但我也看到了 根据文档来自: 通过ALTERTABLE、DROP TABLE、TRUNCATE、REINDEX、CLUSTER和VACUUM FULL命令获取。这也是未显式指定模式的lock TABLE语句