【问题标题】:Flushing the HTML document early - with ini_set( 'zlib.output_compression','ON')?尽早刷新 HTML 文档 - 使用 ini_set('zlib.output_compression','ON')?
【发布时间】:2012-10-17 13:47:13
【问题描述】:

我的目标是在我的 php 脚本将页面的其余部分拼接在一起并在完成后发送它时,尽早刷新我网站的标题部分。重要的是块被压缩发送到浏览器。 (我使用的是 Apache/2.2 和 PHP/5.3.4)

现在我正在尝试通过在我的 PHP 脚本中调用 ini_set("zlib.output_compression", "On") 来实现这一点。但是,如果我在脚本中的任何地方使用 flush(),即使在最后,压缩也将不再起作用。

问题是:

a) 通过使用这种方法,zlib 将刷新输出缓冲区并在达到此输出缓冲区的大小后将压缩块发送到浏览器?

b) 如果是这样,有什么方法可以通过设置 zlib 的内部缓冲区大小来精细控制 zlip 何时发送我的块 not?默认为 4KB。

c) 是否有任何好的替代方法可以实现早期压缩刷新,可能对我想要刷新的时间进行更精细的控制?也许我完全走错了路:)

【问题讨论】:

标签: php html document zlib flush


【解决方案1】:

自从我不得不在 OB 上使用 zlib 压缩以来已经很久了(稍后会详细说明原因)。但是,让我尝试说服您在 PHP 中关闭 OB 上的 zlib 压缩。首先,有一点背景,以确保我们在同一页面上。

OB 是如何工作的

每次 php 打印一些东西,如果没有 OB,它将直接发送到 apache 并从 apache 发送到浏览器。相反,使用 OB,输出在 apache 处停止并等待数据刷新(到浏览器)或脚本结束并自动刷新数据。通过缓冲 Apache 到 Web 浏览器阶段的进程来生成页面时,这可以节省大量时间和资源。

为什么不在 PHP 中使用 OB 压缩

你为什么要让 PHP 压缩它?执行此类任务(以及压缩 js 文件)应该是服务器的工作。为了彻底释放 apache 来处理 php,您“应该”做的是将 NGINX 安装为公众面前。设置为反向代理非常容易,您甚至可以将其安装在与 php 和 apache 相同的服务器上。

所以在端口 80 上设置 NGINX,将 apache 设置在 8080 上(并且只允许 nginx 连接,但如果您将其公开一段时间,请不要担心,因为它已经公开并且非常适合调试绕过 nginx 所以不会出现任何安全问题 - 但我建议您不要将其公开太久)。然后使 nginx 反向代理到 apache,缓存所有从 apache 卸载的静态文件(因为 nginx 代替它们服务)意味着 apache 可以执行更多 php 请求,并让 nginx 执行 OUTPUT COMPRESSION ;) 释放 apache 和 php 甚至更多的请求。作为一个额外的好处,nginx 还可以比 Apache 更快地提供静态文件,并且 Nginx 还使用更少的内存并且可以处理更多的连接。

即使是 nginx 新手也可以在在线阅读一些教程并在 1 天内完成我刚才说的所有内容后进行 nginx 设置。 1 天也度过了愉快的时光。

记住将 PHP 到 Apache 的输出缓冲保持打开,但在 PHP 上关闭 zlib 压缩并在 nginx 上启用它。

【讨论】:

    猜你喜欢
    • 2019-07-14
    • 2012-02-06
    • 2017-06-06
    • 2018-06-12
    • 2012-12-07
    • 2020-07-27
    • 2011-04-17
    • 2016-01-16
    相关资源
    最近更新 更多