我对这个主题进行了一些搜索,但没有发现任何有价值的东西。
如果我不使用 PHP 默认会话处理程序,则请求级别没有会话锁定。所以,我必须自己保护关键部分。
在 Java 中,我们已经同步了. 在 C# 中,我们有lock。
在 PHP 中,如何做到这一点?
我对这个主题进行了一些搜索,但没有发现任何有价值的东西。
如果我不使用 PHP 默认会话处理程序,则请求级别没有会话锁定。所以,我必须自己保护关键部分。
在 Java 中,我们已经同步了. 在 C# 中,我们有lock。
在 PHP 中,如何做到这一点?
为此使用信号量。
由于 PHP 脚本不是多线程的,我不认为关键部分是相关的。我同意你有一个竞争条件,因为多个实例是并行运行的,但是关键部分不能解决你的问题。
如果您使用的是基于文件的会话处理程序,您可以尝试使用基本的flock()
. 如果使用数据库,您可以尝试使用引擎自己的(最好是行级的)锁定机制。如果使用 memcached,您可以尝试实现分布式锁系统。
您不希望应用锁的范围太广。您将需要尽可能细化的内容(可能与会话 ID 相关联)。如果您尝试序列化所有会话行为,您将引入一个巨大的瓶颈。
在数据库世界(和其他地方)中,乐观的“锁”通常是您所需要的。它们涉及一个简单的递增计数器。如果计数为“关闭”(冲突),则记录不会更新,您可以根据需要重新获取并应用您的差异。这是UPDATE table WHERE count = lastcount
与重试相结合的类型。这通常可以解决问题。
当然,您可以使用文件锁定、SYSV 信号量(有节制地)和各种其他方法来实现此目标。请记住,这听起来像是一种竞争条件,但它与线程无关。
大多数时候您不必处理临界区,因为 PHP 没有线程模型(不共享内存)。我什至不认为semephores
你可以使用。正如您在 PHP 创建者 Rasmus Lerdorf 的幻灯片中所见,PHP 使用“无共享架构”。这意味着正如您在幻灯片上看到的那样
共享数据下推到数据存储层
只需在 apache 上运行一个简单的 PHP 脚本,您甚至不必处理关键部分。您必须通过数据库与数据进行交互。您也可以使用文件并锁定它们,但我会使用数据库而不是文件。
希望这能稍微回答你的问题。