服务器上的 PHP 页面是不是同时运行?
Posted
技术标签:
【中文标题】服务器上的 PHP 页面是不是同时运行?【英文标题】:Do PHP pages on a server run simultaneously?服务器上的 PHP 页面是否同时运行? 【发布时间】:2012-01-05 03:27:25 【问题描述】:这似乎是一个非常简单的问题,如果我对计算机进程等有更深入的了解,我可能会知道,但无论如何..
如果两个人从我的服务器请求同一个页面,php 页面是为第一个人处理一次,然后为第二个人处理第二次,还是这些页面可能同时运行?
以此为例。我的 PHP 驱动的在线商店中剩下一件库存商品。用户将此添加到他们的购物车。 PHP 脚本 1) 检查它是否有库存,是的,它有库存,所以它 2) 为他保留它。
如果在检查它是否有库存和保留它之间,同一个 PHP 页面正在为其他人加载,并且在用户 A 检查它是否有库存之后,用户 B 也是如此,在用户 A 有机会之前保留它,所以他们最终都保留了它!
对不起,如果这看起来很愚蠢,似乎无法找到答案,这是什么?
【问题讨论】:
听起来你需要了解交易... 嗨,米克。请不要在您的帖子上签名。诚挚的, 非常感谢大家的建议。所以只是想,有什么办法可以限制它,以便一次只能打开一个数据库连接?并在数据库级别执行此操作?如果一个脚本试图打开一个数据库连接,而一个已经打开,那么 mysql 在打开连接之前会暂停。 你为什么要这样做而不是按照正确的方式去做? 好吧,我经营着一家相当不错的商店,但我仍然不能承担风险,所以我想知道是否有什么我可以实现的东西不会影响我已经到位的 PHP代码。 【参考方案1】:恭喜,您已识别出race condition! :-)
PHP 页面是并行运行还是一个接一个地运行取决于 Web 服务器。通常,Web 服务器会分配多个线程来一次处理多个传入请求。因此,如果两个或多个用户同时请求同一个页面,则可能确实会发生同一脚本的多个实例并行运行。由于时间和调度的差异,每个页面何时会执行哪个操作是不可预测的。
因此,对于您所描述的这种情况,以原子方式对动作进行编程很重要,这意味着它们要么全部完成,要么根本不完成。在您的情况下,您可以使用锁、事务、巧妙形成的 UPDATE
语句、UNIQUE
索引或许多其他技术来避免两个用户保留相同内容的可能性。
【讨论】:
您能否详细说明“它们要么全部完成,要么根本不完成”。这在上下文中有何帮助。如上所述,两个从数据库请求相同参数的脚本可能仍会导致双重“库存”情况......对!?!【参考方案2】:是的,一般来说,无需过多介绍:PHP 脚本会同时针对每个请求分别执行。
为了确保您提到的问题不会发生,您可能应该实现数据库管理系统的功能,称为“transactions”。这样,如果你在数据库层做一些事情,最后你会发现预订不能发生,所有在事务中进行的操作都将被回滚。
除了事务之外您在设计应用程序时应牢记您提到的问题可能会发生。因此,您应该以一种允许您 1)尽可能缩短“检查”和“预订”之间的时间的方式设计您的数据库和应用程序,2)如果您无法预订,则停止操作,最后 - 在紧急情况下- 3) 确定哪个保留在先,哪个应该被撤销。
另一个想法,属于“您的应用程序的设计”类别,我们可以称之为“临时保留”。这意味着如果您要进行预订,您可以暂时(例如几秒钟)锁定您的预订。之后,您可以检查您是否真的可以进行该预订,然后将其变为永久预订或直接撤销。我相信一些系统也会在客户开始预订他/她的位置之后立即进行更长时间的临时预订。然后,如果该过程成功,预订将变为永久预订,但如果经过特定时间后仍未成功,则可以简单地撤销预订,允许其他客户开始该过程。
【讨论】:
【参考方案3】:当然,它们对于 php 是并行的,但是当涉及数据库时,您应该学习数据库管理系统的事务部分。
【讨论】:
我说没有必要只担心 php。但是当数据库问题时,您应该担心正确的事务管理。 是的,我知道你做到了——你刚刚重新安排了你的话。但这只是一个断言。【参考方案4】:是和不是。 PHP 可能会根据服务器设置在同时运行的进程中运行,但在小范围内,您将只有一个数据库。数据库查询是按顺序处理的,因此您永远不会遇到这种冲突。 (只要您在为某人预订之前立即检查物品是否有库存。)More information
当然,用户 A + B 可能都看到它有货,并且 A 可能在 B 之前请求它。但是您的代码可以意识到它现在缺货并向用户 B 显示错误。
(您会遇到多个数据库服务器的问题。如果您在多个服务器上存储相同的数据,则在完全复制数据之前会有延迟时间。但您不会遇到这个问题。我们说的是前 1000 个网站在这里。)
【讨论】:
好吧,您的 of course 子句正是问题的重点,它是由并行运行的脚本引起的,即使是小规模的。而且数据库查询不一定是按顺序处理的,这在很大程度上取决于数据库。 php 可能会同时运行这两个脚本,但一个数据库连接会限制问题。第一个问题应该回答是 ;) 见***.com/questions/4980801/…。以上是关于服务器上的 PHP 页面是不是同时运行?的主要内容,如果未能解决你的问题,请参考以下文章
PHP 无法在带有 nginx 和 php-fpm 的 Amazon EC2 服务器上的页面内工作