代码之家  ›  专栏  ›  技术社区  ›  Integralist

需要通过PHP压缩CSS和JavaScript,但需要了解性能含义和如何实现?

  •  0
  • Integralist  · 技术社区  · 14 年前

    我目前正在使用PHP将多个CSS(或JS)文件包含到一个文件中(以及使用gzip压缩内容)。

    例如,HTML页面调用这样的资源…

    <link rel=“stylesheet”href=“concat.php”?filetype=css&files=stylesheet1,stylesheet2,stylesheet3“></link> <script src=“concat.php?filetype=js&files=script1,script2,script3“></script>

    下面是concat.php文件的示例: http://dl.dropbox.com/u/3687270/Concat.php (请随意评论代码的任何问题)

    但是,我不需要打开我的命令提示符,在我的css/js文件上手动运行yui compressor,我希望concat.php文件至少在css方面处理这个问题(我之所以说css,是因为我很欣赏yui compressor缩小了变量和其他优化,所以在php中复制是不可行的,但是第2部分)。

    我知道这可以用一些雷杰克斯魔法来完成,我做这件事没问题。

    所以,我的问题有两部分,分别是:

    1.)在一个CSS文件上使用preg_replace(或一组每个文件可能有几百行代码的CSS文件)使服务器小型化会带来什么性能影响?通常情况下,这要少得多,但我认为如果服务器压缩了该文件,那么我就不必太担心CSS中的额外空白了。

    2.)如何通过yui compressor运行通过concat.php文件连接的javascript文件?可能通过服务器运行(我可以直接访问服务器,以便在必要时在那里安装yui压缩器),但这是个好主意吗?当然,每次请求页面时对服务器的优化都会很慢,而且会对服务器造成不利影响+增加带宽等。

    出现这种情况的原因是,我必须不断地返回并更改现有的“压缩/缩小”JS/CSS文件,这是一个真正的痛苦,因为我需要获取原始源文件,进行更改,然后重新缩小和上载。当我真的想编辑我的文件,让服务器处理缩小。

    希望有人能帮忙。

    3 回复  |  直到 14 年前
        1
  •  1
  •   gblazex    14 年前

    正如评论中建议的,您可以使用 预建脚本 为此。他们使用YUI压缩器以及其他解决方案,即使你不能在服务器上运行Java。

    第一个可能是 PHP Speedy 仍然有效,但已被放弃。

    一个新的是 Minify 它提供了很多功能,包括通用缓存解决方案,具体取决于服务器的功能(apc、memcached、文件缓存)。

    这些项目的另一个优点是,您的URL不会 查询字符串 在它们中(与您当前的方法相反),这会导致 烦恼 在很多浏览器中 当涉及到缓存时 . 他们还负责 格子平 处理 过期报头 为了你的内容。

    因此,我绝对建议您尝试这些项目中的一个,因为它们会立即产生积极的效果,并且 简单的 配置步骤。

        2
  •  2
  •   ZZ Coder    14 年前

    如果您的Web服务器是Apache,那么应该使用mod_ccat,让Apache使用gzip来处理压缩。

    http://code.google.com/p/modconcat/

    您应该只缩小一次JS,并将缩小的版本保存在服务器上。

        3
  •  0
  •   Kieran Allen    14 年前

    我建议你这样做:

    • 为该特定文件夹打开gzip(Web服务器级别)
    • 使用其中一个工具去除空白并合并文件。这将作为没有启用gzip的搜索引擎/代理用户的备份。然后您将缓存这个的输出-这样昂贵的regex调用就不会再次受到影响。

    如果您正确配置服务器,那么上面的CPU配置就不会非常昂贵。PHP开销不会太大——因为您将拥有一个缓存版的CSS,即。

    -- css.php --
    
    if (!isset($_GET['f'])) {
      exit();
    }
    
    if (file_exists('path/to/cached/css/'.md5($_GET['f'])) {
      // just include that file...
      readfile('/path/to/cached/css/'.md5($_GET['f']));
      exit();
    }
    
    $files = explode(',', $_GET['f']);
    
    ob_start();
    foreach ($files as $file)
    {
      readfile($file);
    }
    
    // set a header (including the etags, future expiration dates..)
    Header(....);
    
    echo ob_get_flush(); // remove whitespace etc..
    
    
    // write a new cached file
    file_put_contents('/path/to/cache/'.md5($_GET['f']));
    
    exit();
    

    然后你可以这样做 HRFF =“CSSPHP?”f=样式.css,something.css,other.css“ 然后,该脚本将生成一个缓存文件,该文件是包含这些文件的MD5。

    上面的例子不完整。实际上更像是伪的。