使用PHP ob_start()压缩内容与Apache Deflate/Gzip有何区别?

26

大多数网站希望压缩它们的内容以节省带宽。然而,当涉及到运行 PHP 的 Apache 服务器时,有两种方法可以实现 - 使用 PHP 或者使用 Apache。那么哪一种方法在你的服务器上更快或更容易呢?

举个例子,在 PHP 中,我会在页面开始时运行以下函数来启用它:

/**
 * Gzip compress page output
 * Original function came from wordpress.org
 */
function gzip_compression() {

    //If no encoding was given - then it must not be able to accept gzip pages
    if( empty($_SERVER['HTTP_ACCEPT_ENCODING']) ) { return false; }

    //If zlib is not ALREADY compressing the page - and ob_gzhandler is set
    if (( ini_get('zlib.output_compression') == 'On'
        OR ini_get('zlib.output_compression_level') > 0 )
        OR ini_get('output_handler') == 'ob_gzhandler' ) {
        return false;
    }

    //Else if zlib is loaded start the compression.
    if ( extension_loaded( 'zlib' ) AND (strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== FALSE) ) {
        ob_start('ob_gzhandler');
    }

}

另一种选择是使用Apache的deflate或gzip(两者都非常接近)。要启用它们,您可以将以下内容添加到您的.htaccess文件中:

(此处链接到相关问题) (此处链接到相关问题)(此处链接到相关问题)
AddOutputFilterByType DEFLATE text/html text/plain text/xml application/x-httpd-php

由于PHP是一种脚本语言(必须通过PHP加载),我认为Apache方法应该更加稳定和快速。但是在现实世界中假设不太有用。

毕竟,你可能会认为由于Windows拥有巨大的财力支持......,我们就不去那里了。

1个回答

14

我们运行着很多 Web 服务器,每天处理着 60M / 独立访客。通常这不值得一提,但你的问题似乎基于经验。

我们选择使用 Apache 进行操作。无论您选择哪种方法,最终输出结果都是相同的(或者足够接近以至于没有差别)。

我们选择 Apache 的原因有几点:

  • 零维护,我们只需要打开它。没有人需要维护某些情况结构
  • 性能,在我们的测试中,使用 Apache 的服务器表现略微更好。
  • Apache 将对所有内容应用输出过滤器,而不仅仅是 PHP。在某些情况下,同一服务器上服务的其他类型的内容,我们想压缩我们的 .css 和 .js 文件。

警告一下,一些浏览器或其他应用程序会故意篡改客户端头文件,指示支持压缩。有些应用程序这样做是为了简化其在客户端安全方面的工作(例如像诺顿互联网安全之类的应用程序)。您可以忽略此问题,或尝试添加额外的情况来重写请求以使其看起来正常(浏览器确实支持它,应用程序或代理只是紊乱了它以使自己的工作更轻松)。

或者,如果您正在使用 flush() 命令将输出发送到浏览器并应用压缩,则可能需要在字符串末尾填充空格以说服服务器尽早发送数据。


+1:虽然我处理的流量没有你那么大,但我也更喜欢由服务器来处理。有一两个注意点:某些类型的声音文件不应该被压缩,否则媒体播放器会卡顿。这包括使用 mp3 文件的 Windows Media Player。 - Powerlord
虽然这个问题是与媒体播放器8有关的,所以现在可能已经被修复了。 - Powerlord
1
通常我只压缩text/*类型的项目,然后再挑选一些其他内容类型(如application/json)来获取其余部分。 - preinheimer

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