同时请求PHP脚本

Kev*_*oyd 85 php request

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

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

Pas*_*TIN 139

服务器根据其配置通常可以同时为数百个请求提供服务- 如果使用Apache,MaxClients配置选项就是:

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


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

所以:

请求会排队吗?

不 除非:

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


他们会被忽视吗?

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

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


还有其他可能吗?

是的^^


编辑OP和评论后编辑:

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

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

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


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

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

mau*_*ris 19

如果2个客户端同时调用服务器,则服务器很可能几乎同时回复两个客户端.我在这里的客户端将它们定义为浏览器级别.

这意味着在同一台机器上,如果您使用2个浏览器同时加载同一个网站/页面,则两个浏览器应同时加载.

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

看看这个例子.这2个文件是从同一个会话加载的,同一个浏览器是同一个用户.

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

               scriptb.php requested           scriptb.php started
---------------+-------------------------------+-----------------+--->
                                                                 scriptb.php served.
Run Code Online (Sandbox Code Playgroud)

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

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


Jus*_*tin 5

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