同时向PHP脚本请求

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

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

服务器,根据其configuration,通常可以同时服务数百个请求 – 如果使用Apache, MaxClientsconfiguration选项是这样一种说法:

MaxClients指令设置将被服务的同时请求数量的限制。
通过MaxClients限制的任何连接尝试通常都会排队,直到基于ListenBacklog指令的数字。
一旦subprocess在不同的请求结束时被释放,连接将被服务。

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

所以:

请求会排队吗?

不 除非:

  • 在某个地方有一些 – 例如,如果这两个请求来自同一个客户端,并且您正在PHP中使用基于文件的会话 :当脚本正在执行时,会话被“locking”意味着服务器/客户端将不得不等待,直到第一个请求完成(文件解锁 ),才能使用该文件为第二个用户打开会话。
  • 请求来自同一个客户端和同一浏览器; 即使没有任何服务器端产生这种行为,大多数浏览器也会在这种情况下排队请求。
  • 有超过MaxClients目前活跃的进程 – 请参阅前面的Apache手册的报价。

他们会被忽略吗?

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

如果是这样,我不能发表这个答案,如果你在哪里打F5在同一时间,看看有人回答!
(那么,SO不在PHP中,但原理是一样的)

任何其他可能性?

是^^

在编辑完OP和注释之后进行编辑:

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

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

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

真的,你可以让两个用户向同一个PHP脚本(或者不同的PHP脚本都包含相同的PHP文件)发送请求。 这绝对不是一个问题,或者我曾经从事的任何网站都没有工作!

如果2个客户端同时呼叫服务器,则服务器几乎可以同时回复两个客户端。 这里的客户我把它们定义到浏览器级别。

这意味着在同一台机器上,如果您使用2个浏览器同时加载同一个网站/页面,则应同时加载这两个浏览器。

不过,因为我们正在谈论PHP,所以您需要特别注意会话。 如果您的页面使用会话,则服务器一次只能提供一个页面。 这是因为会话文件将被locking,直到脚本退出。

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

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

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

这个过程将不断重复,以防止多个脚本写入相同的会话文件导致延迟。 因此,build议在不再使用会话时调用session_write_close (),特别是在使用多个iframe或AJAX的网站上。

除非你正在运行一个非标准的设置,否则你的web服务器(Apache,IIS,nginx等)将有多个进程分别为每个进入服务器的请求运行PHP。 同时的请求将被同时处理。

刚刚碰到这个自己。 基本上你需要调用session_write_close()来防止单用户locking。 确保一旦你调用session_write_close()你不会尝试修改任何会话variables。 一旦你调用它,从此以后将会话视为只读。