5

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

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

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

4

1 回答 1

5

锁由操作系统处理。所以:

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

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

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

于 2012-01-19T01:26:47.943 回答