PHP输出缓冲对Apache和MySQL的性能影响

4

我对php缓冲的工作原理有点困惑。

假设你有一个名为foo.php的php页面,且在php.ini中设置了output_buffering = 4096。当Apache接收到对foo.php的get请求时,foo.php开始执行,一旦准备好4096字节,它们就会被发送到Apache。Apache开始将这些4096字节发送给客户端。

这里是我不理解的地方:如果浏览器遇到了一些恶意的跟踪器调用、javascript或者发送到浏览器的图片,导致浏览器挂起了并且一段时间内没有向Apache回复,这会使Apache被阻塞。Apache没有释放MySQL线程,这会显示为“睡眠状态”。这个理解正确吗?还是我完全错了?

2个回答

4

你完全错了 :)

当出现一些恶意的跟踪器调用、JavaScript或发送到浏览器的图像时会发生什么

这不会对服务器端产生任何影响。

通过PHP运行的每个请求将会:

  1. 编译所需的PHP文件为opt-code(除非启用缓存)
  2. 执行PHP opt-code
  3. 返回PHP opt-code的字符串结果给浏览器

你所说的缓冲发生在步骤2和3之间。所以,让我们看看你的情景。

  1. 请求PHP URL
  2. 编译opt-code
  3. 开始执行PHP并开始返回html字符串
  4. 创建一个包含缓慢加载img标签的字符串
    • PHP继续向Apache输出
    • 为图像(或JavaScript代码、等等)进行单独的http请求

这里重要的是单独的请求。所有PHP和Apache都只是将HTML返回给浏览器。这个HTML可能会生成一个img或javascript标签,该标签将回调到同一Web服务器,但这些请求将与生成现有页面的HTML的请求分别处理。


2
浏览器在从服务器下载HTML数据时不会“卡住”。即使它正在等待JavaScript文件下载,它仍然会继续下载整个页面,直到实际显示任何内容为止。
当然,如果由于某种原因浏览器/服务器连接中断,您可能会看到Apache一直等待ACK,直到连接超时,但这并不是通常的情况。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接