同时请求 PHP 脚本
如果PHP引擎已经在服务器上执行脚本的过程中,那么其他浏览器同时请求同一脚本会发生什么?
- 请求是否会排队?
- 他们会被忽视吗?
- 每个请求都有自己的脚本实例吗?
- 还有其他可能性吗?
如果PHP引擎已经在服务器上执行脚本的过程中,那么其他浏览器同时请求同一脚本会发生什么?
服务器,根据其配置,通常可以同时为数百个请求提供服务 - 如果使用Apache,MaxClients
配置选项是说:
该指令对将要处理的同时请求数设置限制。
任何超过限制的连接尝试通常都会排队,最多可以排队一个基于 ListenBacklog 指令的数字。
一旦子进程在另一个请求结束时被释放,连接就会得到处理。MaxClients
MaxClients
两个客户端请求同一页面的事实不是问题。
所以:
请求是否会排队?
否 ;除非:
MaxClients
他们会被忽视吗?
否:这意味着只有一个用户可以同时使用一个网站;这不会很好,不是吗?
如果是这样的话,我不能发布这个答案,如果你在同一时刻点击F5,看看是否有人回答!
(好吧,SO不在PHP中,但原理是相同的)
还有其他可能性吗?
是 ^^
编辑 OP 和注释后进行编辑:
每个请求都有自己的脚本实例吗?
没有“脚本实例”这样的东西:简单地说,对脚本发出请求时发生的事情是:
实际上,您可以让两个用户向同一个PHP脚本(或所有包含相同PHP文件的不同PHP脚本)发送请求;这绝对不是问题,否则我曾经工作过的网站都不会起作用!
如果 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 的网站上。