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

使用PHP ob_start()与Apache Deflate/Gzip压缩内容?,php,apache,gzip,compression,Php,Apache,Gzip,Compression,大多数网站都希望压缩内容以节省带宽。但是,对于运行PHP的apache服务器,有两种方法可以做到这一点——或者使用apache。那么在您的服务器上哪一个更快或更容易呢 例如,在PHP中,我在页面开头运行以下函数以启用它: /** * Gzip compress page output * Original function came from wordpress.org */ function gzip_compression() { //If no encoding was g

大多数网站都希望压缩内容以节省带宽。但是,对于运行PHP的apache服务器,有两种方法可以做到这一点——或者使用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(两者都是)。要启用它们,可以向.htaccess文件中添加类似的内容

AddOutputFilterByType DEFLATE text/html text/plain text/xml application/x-httpd-php
由于PHP是一种脚本语言(必须由PHP加载),我认为apache方法将1)更稳定,2)更快。但是假设在现实世界中没有多大用处


毕竟,你会认为,有了巨大的资金支持,窗口已经。。。呃,我们不去那里。

我们在跑。。。很多Web服务器,每天处理6000万个uniques。通常这不值得一提,但你的问题似乎基于经验

我们在apache中运行它。不管你选择哪种方法,从另一端出来的东西都是一样的(或者足够接近以至于不重要)

我们选择apache有几个原因:

  • 零维护,我们只是打开了它。没有人需要维护一些案例结构
  • 性能方面,在我们的测试服务器中,Apache做得稍微好一点
  • Apache将输出过滤器应用于所有内容,而不仅仅是PHP。在某些情况下,在同一台服务器上提供其他类型的内容,我们希望压缩.css和.js
警告一句,某些浏览器或其他应用程序故意损坏客户端头,表明支持压缩。有些人这样做是为了在客户端安全方面简化工作(想想像norton internet security之类的应用程序)。您可以忽略这一点,或者尝试添加额外的情况,以重新编写请求,使其看起来正常(浏览器确实支持它,应用程序或代理刚刚将其进一步化,以使其自身的生活更轻松)


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

+1:我处理的流量远不如你,但我也更喜欢服务器处理。这里有一两个警告:某些类型的声音文件不应该被压缩,否则媒体播放器会被压缩。这包括带有mp3文件的Windows Media Player。虽然这是Media Player 8的问题,但现在可能已经解决了。通常,我只压缩text/*类型的项目,然后再选择一些内容类型(如application/json)来获取其余内容。