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

Posted

技术标签:

【中文标题】PHP进程/服务器崩溃时如何避免文件死锁?【英文标题】:How to avoid file deadlocks when PHP process/server crashes? 【发布时间】:2012-01-19 01:08:19 【问题描述】:

我是 php 新手。我知道我可以使用flock() 锁定文件并避免两个用户访问同一个 php 文件向可锁定文件添加内容时出现竞争条件。

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

简而言之,PHP 是否确保正确处理此类危急情况(即未显式释放锁)?如果不是,应该如何处理这些情况?如何从这些中恢复?

【问题讨论】:

【参考方案1】:

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

如果一个进程崩溃,它持有的所有锁都会被释放(连同它持有的任何其他类型的资源) 如果系统崩溃,锁定将毫无意义,因为它们不会“延续”到下一次重新启动

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

然而,如果您的网络服务器设置使得每个请求都没有由新进程处理,那么如果一个请求异常终止(假设一个线程被中止),锁将持续并阻塞所有进一步的锁请求,很快就会导致 Web 服务器死锁。这是您真的,真的不应该使用不提供请求之间的进程级隔离的设置的众多原因之一(免责声明:我不是 Web 服务器专家——我可能在“不应该”中错了部分,尽管我对此表示怀疑)。

【讨论】:

以上是关于PHP进程/服务器崩溃时如何避免文件死锁?的主要内容,如果未能解决你的问题,请参考以下文章

如何避免死锁?

如何处理 terraform 进程崩溃并避免重试时资源泄漏?

[ Linux ] 死锁以及如何避免死锁

什么是死锁,简述死锁发生的四个必要条件,如何避免与预防死锁

往数据库插入上万条数据避免服务器崩溃

死锁的条件,预防,避免,检测与消除