如果PHP引擎已经在服务器上执行脚本,那么对同一脚本的其他同时浏览器请求会发生什么?
答案 0 :(得分:138)
服务器(取决于其配置)通常可以同时提供数百个请求 - 如果使用Apache,则 MaxClients
配置选项为一个人说:
MaxClients
指令设置了 限制同时数 将要提供的请求。
任何 连接尝试超过 通常会MaxClients
限制 排队,最多到一个基于的数字 ListenBacklog指令。
曾经的孩子 进程在结束时被释放 不同的请求,连接将 然后得到服务。
两个客户端请求同一页面的事实不是问题。
所以:
请求会排队吗?
不;除非:
MaxClients
个活动进程 - 请参阅之前Apache手册中的引用。
他们会被忽视吗?
否:这意味着只有一个用户可以同时使用网站;这不是很好,是吗?
如果是这样的话,我不能发布这个答案,如果你在同一时刻点击F5,看看有人回答了!
(嗯,SO不在PHP中,但原则是相同的)
还有其他可能吗?
是^^
编辑OP和评论后编辑:
每个请求都有自己的脚本 实例
没有“脚本实例”这样的东西:简单地说,发生脚本请求的地方是:
实际上,您可以让两个用户向同一个PHP脚本发送请求(或者包含相同PHP文件的不同PHP脚本);这绝对不是问题,或者我曾经工作的网站都没有用!
答案 1 :(得分:19)
如果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的网站上。
答案 2 :(得分:4)
我自己也碰到了这个。基本上,您需要调用* xxxxxxx second commit
* xxxxxxx last commit
* xxxxxxx fourth commit
* xxxxxxx third commit
* xxxxxxx first commit
* a000000 common base
以防止单个用户锁定。确保一旦调用session_write_close()
,就不要尝试修改任何会话变量。一旦调用它,从那时起将会话视为只读。
答案 3 :(得分:3)
除非您运行的是非标准设置,否则您的Web服务器(Apache,IIS,nginx等)将具有多个进程,这些进程分别为进入服务器的每个请求运行PHP。同时请求将同时提供服务。