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

Pek*_*ica 16 php locking

SO用户问了一个问题,答案实际上是"使用锁定机制".

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

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

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

唯一看起来中途不错的是mySQL GET_LOCK().

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

sym*_*ean 3

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

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

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