【问题标题】:Any way to chunk gzip with Apache and PHP使用 Apache 和 PHP 对 gzip 进行分块的任何方式
【发布时间】:2023-07-15 00:52:01
【问题描述】:

我在一个网站上有一个 Web 应用程序,它需要一段时间(约 10 秒)才能完成页面底部附近的一部分 - 它已尽可能优化,缓存不是一种选择。

我们通过 .htaccess 指令 SetOutputFilter DEFLATE 在服务器上启用了压缩,问题是这会导致整个页面在开始输出给用户之前一直保持到完成,这不是最佳的,因为用户什么都看不到,直到页面完成。

我也通过 php ob_start("ob_gzhandler"); 方法尝试过。

目前,我的 .htaccess 中有一个 <FilesMatch > 限制此特定脚本被压缩。

基本上我的问题是这样的 - 有没有办法说块 gzip 或 deflate 以便用户将它分成几部分,以便他们可以看到页面已经开始加载?

【问题讨论】:

    标签: php .htaccess gzip deflate chunked


    【解决方案1】:

    我会说:不。我认为现在有 HTTP 提供的方式。

    【讨论】:

      【解决方案2】:

      如果您使用ob_start("ob_gzhandler") 方法,您可以这样做 - 您需要查看flushob_flush 函数。

      一些示例代码 - 尝试使用 curl 加载,或使用 fiddler 检查实际的 http 响应

      <?php
      ob_start('ob_gzhandler');
      print "chunk 1";
      ob_flush();
      flush();
      sleep(2);
      print "chunk 2";
      ob_end_flush();
      

      不幸的是,浏览器似乎不会以块的形式显示它——我认为这是因为每个块的数据太小了。你可以通过在你的测试文件上调用wget -O - -q http://chunktest/chunktest.php来验证这个效果。

      还有一些更有用的资源here

      【讨论】:

      • 好吧,我发现这很有希望,但经过一些测试后,它似乎不起作用。我添加了 echo str_repeat(' ', 1000000);在 ob_flush 之前,为了确保当它刷新到 apache 时,apache 会将其刷新到浏览器。我得到相同的结果,浏览器、wget 和 curl
      【解决方案3】:

      如果页面的加载时间很长,处理它的创造性方法是使用非常快速的加载页面,并通过 ajax 调用页面上的长时间加载内容。我们对提取详细会员使用统计数据的页面执行此操作...其他网站,例如 Adsense,在其报告页面上执行此操作。

      【讨论】:

      • 好吧,我强烈希望避免对 JavaScript 的依赖——不过 iFrame 可能是可行的。
      最近更新 更多