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

php和apache如何处理多个请求?,php,Php,PHP如何处理来自用户的多个请求?它是一次处理所有请求,还是一次处理一个请求,等待第一个请求完成,然后移动到下一个请求 事实上,我在一个静态站点上添加了一点wiki,如果用户发现企业地址不准确或者可以改进,他们可以编辑这些地址。只有注册用户才能这样做。当用户编辑业务名称时,该名称及其出现的其他名称将在表中的不同行中更改。我有点担心如果10个用户同时这么做会发生什么。这将是一个真正的混乱的东西。PHP是按照每个脚本(update.PHP)接收的顺序一次执行一项操作,还是一次执行所有操作。请求由we

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


事实上,我在一个静态站点上添加了一点wiki,如果用户发现企业地址不准确或者可以改进,他们可以编辑这些地址。只有注册用户才能这样做。当用户编辑业务名称时,该名称及其出现的其他名称将在表中的不同行中更改。我有点担心如果10个用户同时这么做会发生什么。这将是一个真正的混乱的东西。PHP是按照每个脚本(update.PHP)接收的顺序一次执行一项操作,还是一次执行所有操作。

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

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

关于mish mash,对于DB来说,在1秒内处理10个请求与在10秒内处理10个请求是一样的,它不会混淆它们,而是一个接一个地执行它们

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

编辑:

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

  • 每当用户打开页面进行编辑时,您可以“锁定”该记录进行编辑,而不允许其他用户打开该记录进行编辑。如果用户在完成记录后没有“解锁”,您可能会遇到一些问题
  • 您可以实时(使用AJAX)通知用户他们正在编辑的条目已被修改,就像在您键入时发布新答案或注释时发生堆栈溢出一样
  • 当用户提交编辑时,您可以检查记录是否在开始编辑和尝试提交之间编辑,并在其版本旁边显示新版本,以便他们手动“合并”两个更新

  • 可能还有更多的解决方案,但这些应该可以让您开始使用。

    这取决于您使用的Apache版本及其配置方式,但常见的默认配置使用多个工作线程和多个线程来处理同时请求。请参阅,以了解其工作原理。最终的结果是,您的PHP脚本可能一起有几十个开放的数据库连接,可能同时发送几个查询

    但是,您的DBMS设计用于处理此问题。如果您只执行简单的
    INSERT
    查询,那么您的代码不需要做任何特殊的事情。您的DBMS将自行处理必要的锁。对于多个插入,行级锁定将是最快的,因此,如果使用MySQL,则应该考虑NYNDB存储引擎。 当然,无论是由于数据库连接太多、唯一索引冲突等原因,您的查询总是会失败。请将查询包装在
    try catch
    块中以处理这种情况


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

    处理请求的是web服务器,而不是PHP。web服务器将按照您配置的方式处理请求。数据库将处理并发问题,但是,如果用户在编辑一个旧版本的记录时,需要决定如何处理和用户会遇到什么行为。在编辑数据库中的任何行时,您可能需要考虑实现表或行锁定,以防止同一行的多个并发访问。每个HTTP请求彼此独立,处理该请求的所有内容也将是。如果你的10个用户都加载同一个页面并对其进行编辑,那么最后一个提交更改的人将“获胜”。@Chimera我正考虑这样做。但这会返回一个错误,还是会拒绝那些不更新而只是阅读内容的用户的访问呢?+1回答得好。我想补充一点,诺曼可能会担心两个用户同时编辑某些内容,然后一个接一个地提交这些内容—“Acme”被用户a更改为“Acme Inc”,而“Acme LLC”被用户b更改为“Acme Inc”,但如果用户b看到它是“Acme Inc”,他可能根本不想更改它。可以使用“上次更新”时间戳来比较何时加载编辑表单和何时上次更新内容,以通知用户自打开编辑表单以来内容已更新,而不是删除现有更改。