使用 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 压缩内容?的主要内容,如果未能解决你的问题,请参考以下文章