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

Posted

技术标签:

【中文标题】使用 PHP ob_start() 与 Apache Deflate/Gzip 压缩内容?【英文标题】:Compressing content with PHP ob_start() vs Apache Deflate/Gzip? 【发布时间】:2010-12-24 04:11:17 【问题描述】:

大多数网站都希望压缩其内容以节省带宽。然而,当涉及到运行 php 的 apache 服务器时,有两种方法可以做到这一点 - with 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');
    


other option 是使用 Apache deflate or gzip(两者都是very close)。要启用它们,您可以在 .htaccess 文件中添加类似的内容。

AddOutputFilterByType DEFLATE text/html text/plain text/xml application/x-httpd-php

由于 PHP 是一种脚本语言(必须由 PHP 加载),我认为 apache 方法会 1)更稳定,2)更快。但是假设在现实世界中没有多大用处。

毕竟,您会认为拥有庞大的财务支持窗口...,我们不会去那里。

【问题讨论】:

【参考方案1】:

我们正在运行...很多网络服务器,每天处理 60M/uniques。通常这不值得一提,但您的问题似乎是基于经验。

我们在 apache 中运行。无论您选择哪种方法,另一端的输出都是相同的(或足够接近以至于无关紧要)。

我们选择 apache 有几个原因:

零维护,我们刚刚开启。没有人需要维护某种案例结构 性能,在我们的测试服务器中,Apache 完成工作的服务器稍微好一点。 Apache 会将输出过滤器应用于所有内容,而不仅仅是 PHP。在某些情况下,同一服务器上提供其他类型的内容,我们希望压缩我们的 .css 和 .js

一个警告词,一些浏览器或其他应用程序故意破坏客户端标头,表明支持压缩。有些人这样做是为了减轻他们在客户端安全方面的工作(想想诺顿互联网安全等应用程序)。您可以忽略这一点,或者尝试添加额外的案例来重写请求以使其看起来正常(浏览器确实支持它,应用程序或代理只是为了让自己的生活更轻松而对其进行了改进)。

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

【讨论】:

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

以上是关于使用 PHP ob_start() 与 Apache Deflate/Gzip 压缩内容?的主要内容,如果未能解决你的问题,请参考以下文章

php中ob_start()有啥用?

php 如何在php中使用ob_start()

PHP中的ob_start用法详解

解析PHP中ob_start()函数的用法

如何使用 ob_start 追加到文件

php [php:ob_start] stdout缓存样本。 #PHP