如果PHP引擎已经在服务器上执行脚本的过程中,其他同时向同一脚本发出的浏览器请求又会如何?
- 请求会排队吗?
- 他们会被忽略吗?
- 每个请求都会有自己的脚本实例吗?
- 还有其他可能性吗?
Answers:
根据服务器的配置,服务器通常可以同时处理数百个请求-如果使用Apache,则MaxClients
配置选项就是这样:
该
MaxClients
指令设置了将同时服务的请求数的限制。
任何超出MaxClients
限制的连接尝试 通常都会排队,最多可以排队一个基于ListenBacklog指令的数目。
一旦在另一个请求结束时释放了子进程,则将为连接提供服务。
两个客户端请求同一页面的事实不是问题。
因此:
请求会排队吗?
没有 除非:
MaxClients
当前活动的进程不止这些-请参阅Apache手册中的引言。他们会被忽略吗?
不:这意味着只有一个用户可以同时使用一个网站; 这不是很好吗?
如果是这样,如果您同时按下F5以查看是否有人回答,那么我将无法发布此答案!
(嗯,SO不是用PHP编写的,但是原理是相同的)
还有其他可能性吗?
是的^^
编辑OP和注释后进行编辑:
每个请求都会有自己的脚本实例吗?
没有“脚本实例”这样的东西:简单地说,向脚本发出请求的地方是:
实际上,您可以让两个用户向同一个PHP脚本(或向都包含相同PHP文件的不同PHP脚本)发送请求;绝对不是问题,或者我曾经使用的网站都无法正常工作!
如果两个客户端同时呼叫服务器,则服务器很可能几乎同时回复两个客户端。我在这里将客户端定义为浏览器级别。
意思是说在同一台计算机上,如果您使用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的网站上调用()。