对PHP脚本的同时请求


Answers:


140

根据服务器的配置,服务器通常可以同时处理数百个请求-如果使用Apache,则MaxClients配置选项就是这样:

MaxClients指令设置了将同时服务的请求数的限制。
任何超出MaxClients 限制的连接尝试 通常都会排队,最多可以排队一个基于ListenBacklog指令的数目。
一旦在另一个请求结束时释放了子进程,则将为连接提供服务。


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

因此:

请求会排队吗?

没有 除非:

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


他们会被忽略吗?

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

如果是这样,如果您同时按下F5以查看是否有人回答,那么我将无法发布此答案!
(嗯,SO不是用PHP编写的,但是原理是相同的)


还有其他可能性吗?

是的^^


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

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

没有“脚本实例”这样的东西:简单地说,向脚本发出请求的地方是:

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


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


如果多个同时请求正在访问同一个php文件,结果将是什么。其他请求将保持待处理状态,还是每个请求都有自己的脚本实例?
Kevin Boyd

3
没有“脚本实例”这样的东西:每个请求都由不同的进程(或线程)处理;可以从内存/磁盘读取脚本,但是可以同时从多个进程中读取同一文件,而不会出现问题(至少在“现代”操作系统上,例如Windows和Linux)
Pascal MARTIN

这是一个很好的答案,在哪里可以了解有关PHP工作原理的更多详细信息?有什么好书吗?
凯文·博伊德

1
我真的不太了解:我猜想翻阅手册,在网上阅读文章,在这里和那里的问题/答案,以及使用PHP几年是学习的好方法-但是我可以真的不推荐任何能确切解释PHP工作原理的书;在“扩展和嵌入PHP”中有一些信息,但是其主题不是解释PHP如何工作;也许php.net/manual/en/internals2.php可以提供帮助?
Pascal MARTIN

完美!对我有很大帮助!
zookastos

21

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

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

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

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

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

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

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

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


4

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


3

除非您运行的是非标准设置,否则您的Web服务器(Apache,IIS,nginx等)将具有多个进程,分别针对服务器中的每个请求运行PHP。同时请求将被同时处理。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.