PHP进程/服务器崩溃时如何避免文件死锁?

时间:2012-01-19 01:08:19

标签: php crash release file-locking

我是PHP的新手。我知道我可以使用flock()来锁定文件并避免竞争条件,当两个用户到达相同的php文件时,将内容添加到可锁定文件中。

然而,如果php进程崩溃会发生什么?等待可锁定文件的下一个用户会发生什么?如果服务器崩溃(某人拔插头)会发生什么?锁是否自动释放?重启服务器后文件是否会保持锁定状态?

为简化起见,PHP是否确保正确处理此类紧急情况(即未明确释放的锁定)?如果没有,应该如何处理这些情况?如何从这些中恢复?

1 个答案:

答案 0 :(得分:5)

锁由操作系统处理。因此:

  • 如果某个进程崩溃,它所持有的所有锁都会被释放(以及它持有的任何其他类型的资源)
  • 如果系统崩溃,锁定是没有意义的,因为它们没有"结转"到下次重启

除了使用操作系统提供的锁定文件机制之外,PHP不需要做任何特殊的事情,所以一般来说你是完全安全的。

但是,如果你的网络服务器设置是这样的,每个请求都不是由新进程处理的话,那么如果一个请求被异常终止(让我们说一个线程被中止)那么锁将持续并阻止所有进一步的锁定请求,很快导致死锁的Web服务器。这是你真的,真的不应该使用不在请求之间提供进程级别隔离的设置的众多原因之一(免责声明:我不是网络服务器专家 - 我可能错了"不应该"部分,即使我怀疑)。