同时请求PHP脚本

时间:2009-09-16 04:05:35

标签: php request

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

  • 请求会排队吗?
  • 他们会被忽视吗?
  • 每个请求都有自己的脚本 实例
  • 还有其他可能吗?

4 个答案:

答案 0 :(得分:138)

服务器(取决于其配置)通常可以同时提供数百个请求 - 如果使用Apache,则 MaxClients 配置选项为一个人说:

  

MaxClients指令设置了   限制同时数   将要提供的请求。
任何   连接尝试超过   通常会MaxClients限制   排队,最多到一个基于的数字   ListenBacklog指令。
曾经的孩子   进程在结束时被释放   不同的请求,连接将   然后得到服务。


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

所以:

  

请求会排队吗?

不;除非:

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


  

他们会被忽视吗?

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

如果是这样的话,我不能发布这个答案,如果你在同一时刻点击F5,看看有人回答了!
(嗯,SO不在PHP中,但原则是相同的)


  

还有其他可能吗?

是^^


编辑OP和评论后编辑:

  

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

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

  • 网络服务器分叉另一个进程来处理请求(通常,出于性能原因,这些分叉是提前制作的,但这没有任何改变)
  • 该进程从磁盘读取PHP脚本
    • 多个进程可以同时执行此操作:文件读取时没有锁定
    • 将文件加载到内存中;在每个进程的不同内存块中
  • 内存中的PHP文件是“编译”到操作码 - 仍在内存中
  • 执行这些操作码 - 仍然来自属于回答您请求的进程的内存块


实际上,您可以让两个用户向同一个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。同时请求将同时提供服务。