【问题标题】:How server manage different user's requests at a time?服务器如何一次管理不同用户的请求?
【发布时间】:2011-02-27 03:01:22
【问题描述】:

你能告诉我服务器如何一次处理不同的http请求吗?如果 10 个用户同时登录一个站点并发送一个页面请求会发生什么?

【问题讨论】:

    标签: php apache apache2


    【解决方案1】:

    通常,每个用户都会为页面发送一个 HTTP 请求。服务器接收请求并将它们委托给不同的工作人员(进程或线程)。

    根据给定的 URL,服务器读取文件并将其发送回用户。如果该文件是动态文件,例如 PHP 文件,则该文件会在返回给用户之前执行。

    一旦请求的文件被发回,服务器通常会在几秒钟后关闭连接。

    更多信息请见:HowStuffWorks Web Servers

    【讨论】:

      【解决方案2】:

      HTTP 使用 TCP,它是一种基于连接的协议。也就是说,客户端在与服务器通信时建立 TCP 连接。

      允许多个客户端同时连接到同一目标计算机上的同一目标端口。服务器只是同时打开了多个连接。

      Apache(和大多数其他 HTTP 服务器)有一个多处理模块 (MPM)。这负责分配 Apache 线程/进程来处理连接。然后,这些进程或线程可以在它们自己的连接上并行运行,而不会相互阻塞。即使没有打开连接,Apache 的 MPM 也倾向于保持打开的“备用”线程或进程,这有助于加快后续请求。

      Apache 附带的程序ab(ApacheBench 的缩写)可让您测试同时打开多个与 HTTP 服务器的连接时会发生什么。

      Apache 的配置文件通常会为其接受的同时连接数设置一个限制。这将设置为一个合理的数字,以便在正常操作期间永远不会达到此限制。

      还要注意,HTTP 协议(​​从 1.1 版开始)允许连接保持打开状态,以便客户端可以在关闭连接之前发出多个 HTTP 请求,从而可能减少他们需要同时建立的连接数。

      更多关于 Apache 的 MPM:

      Apache 本身可以使用许多不同的多处理模块 (MPM)。 Apache 1.x 通常使用一个名为“prefork”的模块,它预先创建了多个 Apache 进程,以便经常可以将传入的连接发送到现有进程。这是我上面描述的。

      Apache 2.x 通常使用名为“worker”的 MPM,它使用multithreading(在单个进程中运行多个执行线程)来实现相同的目的。多线程相对于单独的进程的优势在于,与打开单独的进程相比,线程的重量要轻得多,甚至可以使用更少的内存。速度非常快。

      多线程的缺点是你不能运行 mod_php 之类的东西。当您使用多线程时,您的所有插件库都需要是“线程安全的”——也就是说,它们需要知道在多线程环境中运行。编写多线程应用程序更难。因为进程中的线程在它们之间共享一些内存/资源,所以这很容易产生竞争条件错误,即当另一个线程正在写入内存时线程读取或写入内存。解决这个问题需要locking 等技术。 PHP 的许多内置库都不是线程安全的,因此希望使用 mod_php 的人不能使用 Apache 的“worker” MPM。

      【讨论】:

        【解决方案3】:

        Apache 2 有两种不同的操作模式。一个以threaded server 运行,另一个使用称为“prefork”(multiple processes)的模式。

        【讨论】:

          【解决方案4】:

          请求将被同时处理,以达到 HTTP 守护程序的最佳能力。

          通常情况下,HTTP 守护进程将生成多个进程或多个线程,每个进程将处理一个客户端请求。服务器可以保留备用线程/进程,以便当客户端发出请求时,它不必等待线程/进程被创建。每个线程/进程可以映射到不同的处理器或内核,以便更快地处理它们。然而,在大多数情况下,保持请求的是网络 I/O,而不是缺少原始计算,因此处理器/内核的数量通常不会因一次处理的请求数量显着减少而导致速度下降。

          【讨论】:

            【解决方案5】:

            服务器(apache)是多线程的,这意味着它可以同时运行多个程序。几年前,单个 CPU 可以在多个线程之间快速来回切换,给人一种同时发生两件事的感觉。如今,计算机具有多个处理器,因此计算机实际上可以同时运行两个代码线程。话虽如此,线程并没有真正以任何简单的方式映射到处理器。

            有了这种能力,PHP 程序可以被认为是一个执行线程。如果两个请求同时到达服务器,则可以使用两个线程同时处理该请求。它们可能都将获得大约相同数量的 CPU,因此如果它们执行相同的操作,它们将大约在同一时间完成。

            多线程最常见的问题之一是“竞争条件”——两个请求在做同样的事情(“竞争”做同样的事情),如果它是单个资源,其中一个会赢。如果他们都向数据库中插入一条记录,他们就不能都获得相同的 id——他们中的一个会赢。所以你在写代码的时候要小心,要意识到其他请求同时在进行,并且可能会修改你的数据库、写入文件或更改全局变量。

            话虽如此,编程模型允许您在很大程度上忽略这种复杂性。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2016-04-05
              • 1970-01-01
              • 1970-01-01
              • 2011-08-29
              • 2012-05-09
              • 2018-01-07
              • 1970-01-01
              相关资源
              最近更新 更多