php为“高流量”网站

时间:2010-01-13 02:58:00

标签: php

我已经读过PHP的“可能”弱点是它处理“并发”的方式。只有会话和cookie来跟踪用户状态,PHP如何高精度地处理以下情况:

  1. 多个用户签出一个只有1个库存库存的商品(对不起语法错误,但你已经得到了图片)

  2. 多个用户使用相同的登录详细信息登录同一个用户帐户

  3. 多个用户同时编辑同一图像(虽然这在现实生活中很少发生)

  4. 或需要多线程处理的任何其他事务

    (如果我在这里误用了条款,我道歉)

6 个答案:

答案 0 :(得分:5)

这些不一定是PHP的问题。考虑到任何选择的技术,这些都是开发人员要克服的问题。

  1. 让他们的库存达到1的用户不是PHP的错。当有人已经将它添加到购物车时,您可以暂时忽略1,如果他们在会话到期之前没有购买它,请将其释放。
  2. 好吗?您可以注销其他用户,也可以管理所有会话。
  3. 同样,他们可能不会在同一时间 。如果他们这样做了,请抛出一个错误的错误,然后让他们再试一次。正如评论中所指出的,MySQL具有足够的能力来处理这些类型的事件(如果它们发生的话)。

答案 1 :(得分:4)

这些不是真正的并发问题。虽然PHP作为一个环境缺乏线程功能,但任何使用PHP模块的Web服务器都将拥有多个线程,每个线程都有自己的活动PHP环境,所有线程都使用相同的资源。您可能会遇到Java,.Net,Perl或任何其他Web应用程序语言的这些问题。

  1. 您的数据库上需要一个事务,可能带有写锁定,以便其他用户无法读取它并在其他人检出时运行结帐过程。这不是语言线程问题,它是数据库事务问题。
  2. 这也不是线程问题。使用所有可用的工具,会话相当简单,而且我从来没有听说过任何语言平台上的“每个会话一个线程”的实现方式(这将是非常重要的,难以实现,并且只会增加开销)。您可以允许多个会话令牌在一个帐户中处于活动状态(用户可以根据需要在不同的选项卡或Web浏览器上多次登录),或者您不允许(每次登录过程发生时都清除所有会话令牌,以便仅一个令牌已激活)。
  3. 一个奇怪的,但我不确定线程​​如何适合这里。图像编辑必须在浏览器中的客户端完成。你无法用任何语言保持用户浏览器的“线程”...... HTTP不能像那样工作。你给他们发送了图像,你就完成了,直到他们点击“保存”并将其发回。如果您担心用户会覆盖彼此的更改,那么您只需要对其进行事务锁定即可。我可能只是对每个图像进行“版本化”,如果一个用户发生更新而另一个用户正在编辑它,则会通知其他用户他们需要刷新副本。
  4. 据我所知,没有语言使用线程来完成任何这些任务。由于HTTP通信的无状态特性,cookie是会话是每种 Web语言的支柱,所以无论你使用什么平台,你都会在所有这些平台上看到非常相同的策略处理特定问题。

答案 2 :(得分:1)

  1. 您的数据库应该以原子方式处理事务并删除最后一项,将其从php
  2. 中移除

答案 3 :(得分:0)

就像所有语言一样,您需要找到一些锁定这些文件的方法。如果您不熟悉并发性,可以从here开始,并对可用的不同方法进行一些研究。

但我真正的问题是这实际上是否会成为一个问题。如果你要进入一个高并发系统,那么碰撞时的损坏程度会有多高。如果碰撞的成本非常高,那么可能会将工作外包给那些已经开始研究并且只关注他们使用的方法的人。

答案 4 :(得分:0)

你听说过数据库交易吗?如果使用得当,这些可以解决所有问题(顺便说一下,这不是PHP问题)。

答案 5 :(得分:0)

如果你的问题是关于交易的,那么答案是肯定的,但它不是语言本身的一个特征。事务安全是数据库层的任务(通常是像MySQL这样的关系数据库)。

但如果我读到你的问题,比如“PHP可扩展吗?”,那么答案也是肯定的。

PHP处理“并发”尽可能完美,因为它完全隐藏了与应用程序相关的任何并发相关细节,这对Web应用程序来说是件好事。它使应用程序具有固有的可扩展性,就像HTTP使“Web”可扩展一样。 HTTP是无状态的,因此PHP在某种意义上是无状态的。这允许容易的水平可伸缩性,例如,通过添加更多硬件而无需更改应用程序代码(尽管这仍需要事先获得一些应用程序支持)。

查看这些great articles以获取解释。