php和apache如何处理多个请求?

时间:2014-01-24 18:43:51

标签: php

PHP如何处理来自用户的多个请求?它是一次处理所有这些还是一次处理一个,等待第一个请求完成然后再转移到下一个请求。

实际上,我正在向静态网站添加一些wiki,如果用户发现这些网址不准确或者可以改进,他们就可以编辑这些网址。只有注册用户才可以这样做。当用户编辑商家名称时,该名称及其他名称会在表格的不同行中更改。如果10个用户同时这样做,我会担心会发生什么。这真是一件混乱的事情。因此,PHP按照每个脚本(update.php)接收的顺序或者一次性完成所有操作。

2 个答案:

答案 0 :(得分:5)

请求由Web服务器(运行PHP脚本)并行处理。

更新数据库中的数据非常快,因此即使您需要更新多个表,任何更新都会立即显示。

关于mish mash,对于DB,在1秒内处理10个请求与10个请求在10秒内相同,它不会混淆它们,只是一个接一个地执行它们。

如果您需要更新2个表并且绝对需要这两个更新随后运行而不会被另一个更新查询中断,那么您可以使用事务。

编辑:

如果您不希望2个用户同时编辑同一表单,您可以使用多个选项来阻止它们。以下是一些想法:

  1. 只要用户打开页面进行编辑,您就可以“锁定”该版本的记录,而不是让其他用户打开它进行编辑。如果用户在完成记录后没有“解锁”,则可能会遇到一些问题。
  2. 您可以实时(使用AJAX)通知用户他们正在编辑的条目已被修改,就像在您输入时发布新答案或评论时堆栈溢出一样。
  3. 当用户提交编辑时,您可以检查记录是否在他们开始编辑之间和他们尝试提交时进行编辑,并在他们的版本旁边显示新版本,以便他们手动“合并”2更新。
  4. 可能有更多解决方案,但这些应该可以帮助您入门。

答案 1 :(得分:5)

这取决于您使用的Apache版本及其配置方式,但常见的默认配置使用多个具有多个线程的工作程序来处理同时发出的请求。请参阅http://httpd.apache.org/docs/2.2/mod/worker.html了解其工作原理。最终结果是您的PHP脚本可能会有几十个打开的数据库连接,可能会在同一时间发送多个查询。

但是,您的DBMS旨在解决此问题。如果您只是进行简单的INSERT查询,那么您的代码不需要做任何特殊的操作。您的DBMS将自行处理必要的锁定。对于多个INSERT,行级锁定最快,因此如果使用MySQL,则应考虑使用InnoDB存储引擎。

当然,无论是由于数据库连接太多,是否存在唯一索引冲突等原因,您的查询总是会失败。请将您的查询包裹在try catch块中以处理此情况。

如果您有关于并发性的其他应用程序层问题,例如一个用户覆盖其他用户的更改,那么需要在PHP脚本中处理这些问题。处理此问题的一种方法是使用与数据一起存储的修订号,如果修订号已更改则拒绝执行查询,但是如何处理它取决于您的应用程序。