同时请求 PHP 脚本

2022-08-30 07:50:22

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

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

答案 1

服务器,根据其配置,通常可以同时为数百个请求提供服务 - 如果使用Apache,MaxClients配置选项是说:

该指令对将要处理的同时请求数设置限制。
任何超过限制的连接尝试通常都会排队,最多可以排队一个基于 ListenBacklog 指令的数字。
一旦子进程在另一个请求结束时被释放,连接就会得到处理。MaxClientsMaxClients


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

所以:

请求是否会排队?

否 ;除非:

  • 在某个地方有一些锁定 - 例如,如果两个请求来自同一个客户端,并且您在PHP中使用基于文件的会话:当执行脚本时,会话是“锁定的”,这意味着服务器/客户端必须等到第一个请求完成(并且文件解锁)才能使用该文件为第二个用户打开会话。
  • 请求来自相同的客户端和相同的浏览器;在这种情况下,大多数浏览器都会对请求进行排队,即使没有服务器端产生这种行为。
  • 有比当前活跃的进程更多 - 请参阅Apache手册中的引用。MaxClients


他们会被忽视吗?

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

如果是这样的话,我不能发布这个答案,如果你在同一时刻点击F5,看看是否有人回答!
(好吧,SO不在PHP中,但原理是相同的)


还有其他可能性吗?

是 ^^


编辑 OP 和注释后进行编辑:

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

没有“脚本实例”这样的东西:简单地说,对脚本发出请求时发生的事情是:

  • Web服务器分叉另一个进程来处理请求(通常,出于性能原因,这些分叉是预先制作的,但这不会改变任何东西)
  • 进程从磁盘读取 PHP 脚本
    • 几个进程可以同时执行此操作 :文件读取没有锁定
    • 文件被加载到内存中 ;在每个进程的不同内存块中
  • 内存中的PHP文件被“编译”为操作码 - 仍在内存中
  • 这些操作码被执行 - 仍然来自属于响应您的请求的进程的内存块


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


答案 2

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

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

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

请看这个例子。2个文件从同一会话加载,即同一浏览器同一用户。

      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 的网站上。


推荐