如果 PHP 引擎已经在服务器上执行脚本,其他浏览器同时请求同一脚本会发生什么情况?

  • 请求会排队吗?
  • 他们会被忽视吗?
  • 每个请求都有自己的脚本实例吗?
  • 还有其他可能吗?
有帮助吗?

解决方案

服务器根据其配置,一般可以提供服务 同时处理数百个请求 -- 如果使用 Apache,则 MaxClients 配置选项是这样说的:

MaxClients 指令设置将要服务的同时请求数量的限制。
任何连接尝试 MaxClients 限制通常会排队,最多基于“侦听”指令的数字。
一旦在另一个请求结束时释放了儿童流程后,将为连接提供服务。


两个客户端请求同一页面这一事实并不是问题。

所以 :

请求会排队吗?

不 ;除非:

  • 有一些 某处——例如,如果两个请求来自同一个客户端,并且您正在使用 PHP 中基于文件的会话 :当脚本正在执行时,会话被“锁定”,这意味着服务器/客户端必须等待第一个请求完成 (并且文件已解锁)以便能够使用该文件为第二个用户打开会话。
  • 请求来自同一客户端和同一浏览器;在这种情况下,大多数浏览器都会对请求进行排队,即使服务器端没有任何东西产生这种行为。
  • 有超过 MaxClients 当前活动的进程——请参阅前面 Apache 手册中的引用。


他们会被忽视吗?

不 :这意味着只有一个用户可以同时使用一个网站;这不太好,不是吗?

如果是这样的话,如果您同时按 F5 看看是否有人回答,我就无法发布此答案!
(嗯,PHP中没有SO,但是原理是一样的)


还有其他可能吗?

是的^^


编辑OP和评论后进行编辑:

每个请求都有自己的脚本实例吗?

不存在“脚本实例”:简而言之,向脚本发出请求时发生的情况是:

  • 网络服务器分叉 另一个过程 处理请求 (通常,出于性能原因,这些分叉是提前制作的,但这没有任何改变)
  • 该进程从磁盘读取 PHP 脚本
    • 多个进程可以同时执行此操作 :文件读取没有锁定
    • 文件被加载到内存中;每个进程都在不同的内存块中
  • 内存中的 PHP 文件是“编译的“ 到操作码——仍在内存中
  • 这些操作码被执行——仍然是从属于响应您的请求的进程的内存块中执行的


实际上,您可以让两个用户向同一个 PHP 脚本发送请求 (或全部包含相同 PHP 文件的不同 PHP 脚本) ;这绝对不是问题,否则我曾经工作过的网站都无法工作!

其他提示

如果 2 个客户端同时调用服务器,服务器很可能能够几乎同时回复两个客户端。我在这里将客户端定义为浏览器级别。

意思是说,在同一台机器上,如果您使用两个浏览器同时加载同一个网站/页面,则两者应该同时加载。

然而,由于我们讨论的是 PHP,因此您需要特别注意会话。如果您的页面使用会话,则服务器一次仅提供一个页面。这是因为会话文件将被锁定,直到脚本退出。

看这个例子。这两个文件是从同一会话(即同一浏览器同一用户)加载的。

      scripta.php requested                 scripta.php served
------+---+---------------------------------+------------------------>
          scripta.php started

               scriptb.php requested           scriptb.php started
---------------+-------------------------------+-----------------+--->
                                                                 scriptb.php served.

请注意,scriptb.php 仅在提供 scripta.php 后启动。这是因为当 scripta.php 启动时,会话文件被锁定到其他脚本,以便 scripta.php 可以写入会话文件。当 scripta.php 完成时,会话文件被解锁,因此其他脚本可以使用它。因此 scriptb.php 将等待会话文件被释放,然后它将锁定会话文件并使用它。

此过程将不断重复,以防止多个脚本写入同一会话文件导致延迟。因此建议致电 session_write_close() 当您不再使用会话时,尤其是在使用许多 iframe 或 AJAX 的网站上。

我自己刚刚遇到了这个。基本上你需要打电话 session_write_close() 以防止单用户锁定。致电后请确保 session_write_close() 不过,您不会尝试修改任何会话变量。一旦调用它,从那时起将会话视为只读。

除非您运行的是非常非标准的设置,否则您的 Web 服务器(Apache、IIS、nginx 等)将具有多个进程,这些进程针对进入服务器的每个请求单独运行 PHP。同时请求将同时得到服务。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top