首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么锁定在PHP中如此混乱?

为什么锁定在PHP中如此混乱?
EN

Stack Overflow用户
提问于 2010-10-22 01:42:48
回答 2查看 2.8K关注 0票数 16

一位SO用户问a question,答案是“使用锁定机制”。

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

在某些操作系统上,

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

this question中的讨论非常深入地探讨了这个问题,但只提出了相当复杂的解决方案:使用内存磁盘或Memcache。

唯一看起来还算不错的是mySQL的GET_LOCK().

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-10-22 23:28:29

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

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

解决这个问题的唯一实用方法是使用排队的锁请求,它会超时-但是AFAIK没有操作系统本身就提供了这种功能。我自己写了这样的代码-为专用的was服务器,所以允许其他程序访问是没有问题的,但是我希望它可以扩展到使用inotify的系统范围的强制锁定系统。

票数 3
EN

Stack Overflow用户

发布于 2010-10-22 23:09:42

PHP并不意味着是一个永久的进程,而更像是一个短期的活动线程,因为它经常被创建和销毁。根据实现方式的不同,可以在同一代码上同时运行多个PHP进程。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3990324

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档