使用PHP压缩内容 ob_start() vs Apache Deflate/Gzip?

2022-08-30 17:16:41

大多数网站都希望压缩其内容以节省带宽。但是,当涉及到运行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方法1)更稳定,2)更快。但假设在现实世界中并没有多大用处。

毕竟,您会认为,凭借巨大的财务支持窗口...,我们不会去那里。


答案 1

我们正在运行...大量的网络服务器,每天处理60M /唯一身份。通常这不值得一提,但你的问题似乎基于经验。

我们在apache中运行它。无论你选择哪种方法,从另一端出来的东西都是相同的(或者足够接近,以免重要)。

我们选择apache有几个原因:

  • 零维护,我们只是打开了它。没有人需要维护一些案例结构
  • 性能,在我们的测试服务器中,Apache所做的工作稍微好一些。
  • Apache会将输出过滤器应用于所有内容,而不仅仅是PHP。在某些情况下,同一台服务器上还有其他类型的内容,我们希望压缩.css并.js

一个警告词,某些浏览器或其他应用程序故意破坏客户端标头,指示支持压缩。有些人这样做是为了减轻他们在客户端安全性方面的工作(想想像诺顿网络安全这样的应用程序)。您可以忽略这一点,也可以尝试添加额外的情况来重写请求以使其看起来正常(浏览器确实支持它,应用程序或代理只是将其放大以使其自己的生活更轻松)。

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


答案 2

推荐