如何保护PHP中的关键部分?

时间:2010-04-05 00:55:34

标签: php race-condition critical-section

我对这个主题做了一些搜索,但没有发现任何有价值的内容。

如果我不使用PHP默认会话处理程序,则请求级别没有会话锁定。所以,我必须自己保护关键部分。

在Java中,我们有 同步 。在C#中,我们有 锁定

在PHP中,该怎么做?

3 个答案:

答案 0 :(得分:4)

使用semaphores

答案 1 :(得分:3)

由于PHP脚本不是多线程的,我不认为关键部分是相关的。我同意您有竞争条件,因为多个实例并行运行,但关键部分无法解决您的问题。

如果您使用的是基于文件的会话处理程序,则可以尝试使用基本的flock()。如果使用数据库,您可以尝试使用引擎自己的(最好是行级)锁定机制。如果使用memcached,您可以尝试实现分布式锁系统。

您不希望过于宽泛地应用锁定。你会想要尽可能细化的东西(可能与会话ID相关联)。如果您尝试序列化所有会话行为,则会引入巨大的瓶颈。

在数据库世界(以及其他地方),通常只需要乐观的“锁定”。它们涉及一个递增的简单计数器。如果计数为“关闭”(碰撞),则记录不会更新,您可以根据需要重新获取并应用差异。这是UPDATE table WHERE count = lastcount类型的东西与重试相结合。这通常可以解决问题。

当然,您可以使用文件锁定,SYSV信号量(节俭)和其他各种方法来实现这一目标。请记住,这听起来像是竞争条件,但它与线程无关。

答案 2 :(得分:0)

大多数时候你不必处理关键部分,因为PHP没有线程模型(没有共享内存)。我甚至不认为semephores可供您使用。 PHP使用“Share-nothing Architecture”,正如您在PHP创建者Rasmus Lerdorf的幻灯片中看到的那样。这意味着你可以在幻灯片上看到

  

共享数据被推送到   数据存储层

只需在apache上运行一个简单的PHP脚本,您甚至不必处理关键部分。您必须通过数据库与数据交互。 你也可以使用文件并锁定它们,但我会使用数据库而不是文件。

希望这会回答你的问题。