【问题标题】:PHP - Sending gzip compressed JS/CSSPHP - 发送 gzip 压缩的 JS/CSS
【发布时间】:2011-05-10 12:28:16
【问题描述】:

我用这段代码创建了一个 style.css.php 文件:

<?php

  $gzip = (ob_get_length() === false && !ini_get("zlib.output_compression") && ini_get("output_handler") != "ob_gzhandler" && extension_loaded("zlib") && substr_count($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') && !headers_sent());

  if(!$gzip) header('Location: style.css');

  header('Content-type: text/css');
  header('Cache-Control: no-cache');
  header('Expires: Mon, 1 Jan 1901 04:20:00 GMT');

  ob_start('ob_gzhandler');

  include "style.css";
?>

你怎么看?这是压缩 js/css 文件的好方法吗?有一个更好的方法吗? 我正在为一个公共应用程序这样做。任何人都可以下载。所以共享主机上会有​​人禁用 gzip

【问题讨论】:

  • 我假设你的服务器不支持压缩?
  • 你试图通过这段代码实现什么?预期优势?
  • 好吧,我正在共享服务器上测试它,并且压缩有效。本地也可以。还是您的意思是由服务器完成的自动压缩?这可能吗?
  • PHP 规则 #1:巨大的单行代码无济于事。
  • 最好使用预压缩的 js/css 文件,而不是使用 php "on the fly" 压缩它

标签: php javascript css gzip


【解决方案1】:

不,不行。那里有很多问题。 include,重定向后不死,不考虑deflate方法,...

这对 PHP 来说非常简单,因为 zlib 输出处理程序会自动检测适当的压缩以发送到客户端(如果有);您所要做的就是启用它:

<?php
if (extension_loaded("zlib") && (ini_get("output_handler") != "ob_gzhandler")) {
    ini_set("zlib.output_compression", 1);
}

readfile('style.css');

【讨论】:

  • 谢谢 :) 请问为什么 readfile() 比 include 更好?如果条件为假,我还应该重定向吗?我使用 header("Location") 是因为我认为它会节省一些服务器资源。
  • & 如果我尝试在生成的 html 中启用输出压缩,我会收到一条通知:Notice: ob_end_flush() [ref.outcontrol]: failed to delete buffer zlib output compression :(
  • readfile() 只是以块的形式吸收文件并将它们发送出去。 include/require 将首先通过 PHP 解析器运行数据,如果文件是纯 CSS,这是无用的步骤。
【解决方案2】:

如果您使用 Apache 为您的网站提供服务,您可以使用 mod_gzip 或 mod_deflate。它们通常在共享主机上可用,并且可以在 .htaccess 文件中进行配置。

将以下行添加到您的 .htaccess 文件中:

AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/x-javascript

(即每个 mime 类型一个)

【讨论】:

【解决方案3】:

如果配置正确,服务器应该会自动执行此操作。

【讨论】:

    【解决方案4】:

    Adam 是在正确的轨道上,但它不需要是每行一个 MIME 类型。有关AddOutputFilterByType directive 的更多信息,请参阅 Apache2 手册。

    AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript text/javascript-x application/javascript
    

    【讨论】:

      【解决方案5】:

      “.htaccess”中的第一个 SET

      RewriteEngine on
      RewriteRule style.css style.css.php
      <IfModule mod_deflate.c>
      AddOutputFilterByType DEFLATE text/plain
      AddOutputFilterByType DEFLATE text/html
      AddOutputFilterByType DEFLATE text/xml
      AddOutputFilterByType DEFLATE text/css
      AddOutputFilterByType DEFLATE application/xml
      AddOutputFilterByType DEFLATE application/xhtml+xml
      AddOutputFilterByType DEFLATE application/rss+xml
      AddOutputFilterByType DEFLATE application/javascript
      AddOutputFilterByType DEFLATE application/x-javascript
      SetOutputFilter DEFLATE
      
      BrowserMatch ^Mozilla/4 gzip-only-text/html
      BrowserMatch ^Mozilla/4.0[678] no-gzip
      BrowserMatch MSI[E] !no-gzip !gzip-only-text/html
      
      SetEnvIfNoCase Request_URI 
      .(?:gif|jpe?g|png)$ no-gzip dont-vary
      </IfModule>
      

      建议创建css文件夹并将文件放在那里。

      使用 RewriteRule 你不需要设置header('Content-type: text/css'); 和其他功能在 php 进程之前在服务器上设置 gzip。代码 现在跑得更快了!

      【讨论】:

      • 重要! 有些浏览器不支持gzip for css,那么设置gzip only text/html。更多推荐使用.htaccess 遵守这个规则。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-12
      • 1970-01-01
      • 1970-01-01
      • 2021-07-28
      相关资源
      最近更新 更多