为什么在PHP中锁定这么乱?

时间:2010-10-21 17:42:48

标签: php locking

SO用户问{4}有效答案是“使用锁定机制”。

在研究我的答案时,我发现在PHP中似乎没有简单的,进程间可靠的锁定机制。 a question有一个很大的警告:

  

在某些操作系统上,flock()是在进程级别实现的。使用像ISAPI这样的多线程服务器API时,您可能无法依赖flock()来保护文件免受在同一服务器实例的并行线程中运行的其他PHP脚本的影响!

flock()中的讨论深入研究了这个问题,但只提出了相当复杂的解决方案:使用RAM磁盘或Memcache。

唯一看起来中途不错的是mySQL的this question

所以我的问题是:这真的是这样吗?在PHP中真的没有简单,直接,跨平台的安全锁定系统吗?一个是原子的,并且如果所有者进程死亡将释放锁定,并且不需要大量的设置工作?

2 个答案:

答案 0 :(得分:3)

不同意Wernight的回答。是的,网络内容非常相关 - 但限制因素是操作系统的行为方式。

在PHP支持的所有操作系统上,文件锁定只有两种选择 - 阻塞或非阻塞。最终,PHP必须使用操作系统文件锁定机制,以避免与访问相同文件的非PHP代码冲突。如果您使用阻塞锁,则可能无限期地阻止PHP脚本等待锁被释放 - 这对于Web应用程序来说不是一个好方案。 OTOH,如果你进行非阻塞锁定调用并且它失败了 - 接下来你做什么 - 你是否只是等待一段时间让所有PHP脚本试图抓住锁?

解决问题的唯一可行方法是排队锁定请求超时 - 但AFAIK没有本机提供该设施的操作系统。我自己编写了这样的代码 - 用于专用的Web服务器,因此允许其他程序访问没有问题,但是我希望可以使用inotify扩展到系统范围的强制锁定系统。

答案 1 :(得分:1)

PHP并不是一个永久性的过程,而是作为一个短期生活线程,因为它经常被创建和销毁。根据实现,可以在同一代码上同时运行多个PHP进程。

我相信各种PHP实现(mod_php,PHP CLI等)使PHP中的锁定和线程变得困难。