【问题标题】:performance implications of php output buffering with Apache and MySQL使用 Apache 和 MySQL 进行 php 输出缓冲的性能影响
【发布时间】:2010-10-19 05:42:22
【问题描述】:
我对 php 缓冲的工作原理有点困惑。
假设您在php.ini 中有一个php 页面foo.php 和output_buffering = 4096,并且Apache 收到了一个foo.php 的get 请求。 foo.php 开始执行,一旦准备好 4096 个字节,它们就会被发送到 Apache。 Apache 开始向客户端发送这 4096 个字节。
以下是我不明白的地方:当有一些讨厌的跟踪器标注、javascript 或发送到浏览器的图像时会发生什么。浏览器挂断了,有一段时间没有与 Apache 对话,一直在等待。 Apache 没有发布 MySQL 线程,它显示为“睡眠者”。这是正确的还是我完全不在这里?
【问题讨论】:
标签:
php
mysql
performance
apache
【解决方案1】:
你完全不在基地:)
当有一些讨厌的跟踪器标注时会发生什么,a
javascript 或发送到浏览器的图像
这不会对服务器端产生任何影响。
每个通过 PHP 运行的请求都会
- 将所需的 PHP 文件编译为 opt-code(除非缓存是其中之一)
- 执行 PHP 选择代码
- 将 PHP opt-code 的字符串结果返回给浏览器
您所说的缓冲发生在第 2 步和第 3 步之间。所以,让我们来看看您的场景。
- 请求 PHP URL
- 选择代码已编译
- PHP 执行开始并开始返回 html 字符串
- 创建了一个加载缓慢的 img 标签的字符串
- PHP 继续向 apache 提供输出
- 为图像(或 javascript 代码,或其他任何内容等)发出单独的 http 请求
这是无能为力的单独请求。 PHP 和 Apache 所做的只是将 HTML 返回到浏览器。此 HTML 可能会生成一个 img 或 javasript 标记,这些标记将回调到同一个 Web 服务器,但这些请求将与为现有页面生成 HTML 的请求分开处理。
【解决方案2】:
浏览器不会因为从服务器下载 HTML 数据而“挂起”。它会继续下载整个页面,即使它正在等待一个 JavaScript 文件下载下来,然后才会真正显示它。
当然,如果浏览器/服务器连接由于某种原因中断,您可以让 Apache 等待 ACK 直到连接超时,但这不是通常的情况。