2012-01-05 68 views
3

这可能似乎是一个很简单的问题,我可能会知道,如果我有电脑过程等进行更深入的了解,但不管怎么说..服务器上的PHP页面是否同时运行?

如果两个人从我的服务器请求同样的页面, PHP页面是为第一个人处理一次,然后是第二个人为第二个人处理,还是可能在同一时间彼此并排?

以此为例。我在PHP驱动的在线商店中留下了一个库存物品。用户将其添加到他们的购物车。 Php脚本1)检查是否有库存,是的,它的库存,所以它2)为他保留它。

如果在检查其库存和保留它之间是否有相同的PHP页面正在为其他人加载,并且在用户A检查库存是否正确之后,用户B在用户A得到有机会保留它,所以他们最终保留它!

对不起,如果这看起来很傻,似乎无法找到答案,这是什么?

+2

听起来像你需要了解交易... – 2012-01-05 03:30:35

+1

嗨,米克。请不要在你的帖子上签名。诚挚的, – 2012-01-05 03:34:09

+0

非常感谢您的建议家伙。所以只是想,有什么办法可以限制它,所以一次只能打开一个数据库连接?并在数据库级别执行此操作?如果一个脚本试图打开一个数据库连接,并且一个已经打开,那么MYSQL在打开连接之前暂停。 – user1020317 2012-01-05 03:44:35

回答

7

恭喜,您已经确定了race condition! :-)

PHP页面是并行运行还是依次运行取决于Web服务器。通常,Web服务器会分配多个线程来同时处理多个传入请求。因此,如果两个或多个用户同时请求同一页面,可能会发生同一脚本的多个实例并行运行。由于时间安排和时间安排的不同,每个页面都会精确执行哪个操作是不可预测的。

因此,对于您描述的这种情况,以原子方式对行为进行编程非常重要,这意味着它们要么全部完成,要么根本不完成。在你的情况下,你可以使用锁,交易,巧妙地形成UPDATE报表,UNIQUE索引或许多避免两个用户保留同一事物的可能性的其他技术。

+0

您能详细解释一下“他们要么全部完成,要么完全不完成”。这在上下文中如何起作用?如上所述,从数据库请求相同参数的两个scritpt可能仍然会导致双重“库存”情况...正确!?! – Matte 2012-12-04 14:07:03

-1

是和否。根据服务器设置的不同,PHP可以同时运行,但是在小规模情况下,只能有一个数据库。数据库查询是按顺序处理的,所以你永远不会有这种冲突。 (只要您在为某人预订之前检查某件商品是否有库存)More information

当然,用户A + B可能都会看到它有货,而A可能会在B之前请求它。但是你的代码可以认识到它现在缺货并向用户B显示一个错误。

(你在多个数据库服务器上遇到问题如果你有多个服务器存储相同的数据,但是你不会有这个问题,我们在这里说的就是1000个网站。)

+0

那么,你的*当然*子句恰好是问题的要点,它是由脚本并行运行引起的,即使是小规模的。数据库查询不一定按顺序处理,这非常依赖于数据库。 – deceze 2012-01-05 03:35:18

+0

php可能会同时运行这两个脚本,但是一个数据库连接将限制此问题。第一个问题应该回答是;) – 2012-01-05 03:36:31

+0

请参阅http://stackoverflow.com/questions/4980801/how-simultaneous-queries-are-handled-in-a-mysql-database。 – deceze 2012-01-05 03:42:29

2

是的,一般来说,没有太多细节:PHP sc分别为每个请求同时执行ripts

为了确保您提到的问题没有发生,您应该实施名为“事务”的数据库管理系统的功能。这样,如果你在数据库层上做了一些事情,并且最终你会发现预订不会发生,那么在事务中所做的所有操作都将被回滚。

除了交易你应该设计你的应用程序记住你提到的问题可能发生。因此,您应该设计数据库应用程序,以便您1)尽可能缩短“检查”和“预约”之间的时间,2)如果您不能预约,则停止操作,最后 - 在紧急情况下 - 3)确定哪个预约先到,哪个应该撤销。

另一个想法,落入“您的应用程序的设计”类别中,可能有一些我们可以称之为“临时预约”。这意味着如果您要预订,您可以暂时(例如几秒钟)锁定您的预订。之后,您可以检查您是否真的可以预订,并将其转为永久预订或仅撤销预订。我相信一些系统也会在客户开始预订他/她的位置之后立即做出更长时间的临时预订。然后,如果过程成功,则预订变为永久,但如果某些特定时间过去而没有成功,则可以简单地撤消预约,从而允许另一个客户开始该过程。

-1

是的,他们是平行的php,但是当数据库关心你应该学习数据库管理系统的事务部分。

+0

展开并证明。 – 2012-01-05 03:34:22

+0

我说有没有必要担心只有PHP。但是当数据库担忧时,您应该担心正确的事务管理。 – 2012-01-05 03:37:35

+0

是的,我知道你做了 - 你刚刚重新安排你的话。但这只是一个断言。 – 2012-01-05 16:11:26

相关问题