[关闭]
@52fhy 2015-10-14T16:10:12.000000Z 字数 2687 阅读 436

PHP动态压缩js,css

PHP


正式发布产品时,我们希望将项目里的js,css合并压缩,以减少http请求、防止轻易查看源代码。

使用

只需要在头部引入一下代码即可:

  1. <meta charset="utf-8"/>
  2. <title>demo</title>
  3. <?php
  4. //定义需要压缩的文件
  5. $css = array(
  6. CSS_PATH . 'base.css',
  7. CSS_PATH . 'style.css',
  8. CSS_PATH . 'my.css'
  9. );
  10. $js = array(
  11. PUB_PATH . '/lib/zepto.min.js',
  12. PUB_PATH . '/js/1.js',
  13. JS_PATH . '2.js',
  14. );
  15. $css_path = base_url(parse_css($css));
  16. $js_path = base_url(parse_script($js));
  17. ?>
  18. <link rel="stylesheet" type="text/css" href="<?php echo $css_path ?>">
  19. <script src="<?php echo $js_path ?>"></script>
  20. <!--下面可以继续放不能压缩或者不想压缩的文件-->
  21. <script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>

这段代码会在指定的目录(例如common/)里生成压缩过后的js和css.每次更新了js,css内容,请先删除生成的压缩文件。

示例:

  1. 4e387d5edce14cc2bd6396f6ebb7921b.css
  2. 7c10211f113f3175489196d336d67734.js

注意:
编写的css和js文件一定要符合规范。例如一定要加分号。js的function可以不加分号。

引用的资源

  1. /**
  2. * 合并压缩css
  3. */
  4. function parse_css($urls)
  5. {
  6. $url = md5(implode(',', $urls));
  7. $path = FCPATH. 'static/parse/';
  8. $css_url = $path . $url . '.css';
  9. if (!file_exists($css_url)) {
  10. if (!file_exists($path))
  11. mkdir($path, 0777);
  12. $css_content = '';
  13. foreach ($urls as $url) {
  14. $css_content .= @file_get_contents($url);
  15. }
  16. $css_content = str_replace("\r\n", '', $css_content); //清除换行符
  17. $css_content = str_replace("\n", '', $css_content); //清除换行符
  18. $css_content = str_replace("\t", '', $css_content); //清除制表符
  19. $css_content = str_replace("../images/", "./../common/images/", $css_content);
  20. @file_put_contents($css_url, $css_content);
  21. }
  22. $css_url = str_replace(FCPATH, '', $css_url);
  23. return $css_url;
  24. }
  25. /**
  26. * 合并压缩js
  27. */
  28. function parse_script($urls)
  29. {
  30. $url = md5(implode(',', $urls));
  31. $path = FCPATH. '/static/parse/';
  32. $js_url = $path . $url . '.js';
  33. if (!file_exists($js_url)) {
  34. if (!file_exists($path))
  35. mkdir($path, 0777);
  36. load_qy_lib('JavaScriptPacker');
  37. $js_content = '';
  38. foreach ($urls as $url) {
  39. $append_content = @file_get_contents($url) . "\r\n";
  40. $packer = new JavaScriptPacker($append_content);
  41. $append_content = $packer->_basicCompression($append_content);
  42. $js_content .= $append_content;
  43. }
  44. @file_put_contents($js_url, $js_content);
  45. }
  46. $js_url = str_replace(FCPATH, '', $js_url);
  47. return $js_url;
  48. }

项目里引用到第三方类库JavaScriptPacker可以在github下载:

gkralik/php-uglifyjs
https://github.com/gkralik/php-uglifyjs

  1. /**
  2. * 9 April 2008. version 1.1
  3. *
  4. * This is the php version of the Dean Edwards JavaScript's Packer,
  5. * Based on :
  6. *
  7. * ParseMaster, version 1.0.2 (2005-08-19) Copyright 2005, Dean Edwards
  8. * a multi-pattern parser.
  9. * KNOWN BUG: erroneous behavior when using escapeChar with a replacement
  10. * value that is a function
  11. *
  12. * packer, version 2.0.2 (2005-08-19) Copyright 2004-2005, Dean Edwards
  13. *
  14. * License: http://creativecommons.org/licenses/LGPL/2.1/
  15. *
  16. * Ported to PHP by Nicolas Martin.
  17. *
  18. * ----------------------------------------------------------------------
  19. * changelog:
  20. * 1.1 : correct a bug, '\0' packed then unpacked becomes '\'.
  21. * ----------------------------------------------------------------------
  22. *
  23. * Changes:
  24. * 2014-08-28: grkalik: change class for composer support. no functionality change.
  25. *
  26. */
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注