PHP实现动态压缩js与css文件的方法


Posted in PHP onMay 02, 2018

本文实例讲述了PHP实现动态压缩js与css文件的方法。分享给大家供大家参考,具体如下:

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

使用

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

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

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

示例:

4e387d5edce14cc2bd6396f6ebb7921b.css
7c10211f113f3175489196d336d67734.js

注意:

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

引用的资源

/**
*  合并压缩css
*/
function parse_css($urls)
{
  $url = md5(implode(',', $urls));
  $path = FCPATH. 'static/parse/';
  $css_url = $path . $url . '.css';
  if (!file_exists($css_url)) {
    if (!file_exists($path))
      mkdir($path, 0777);
    $css_content = '';
    foreach ($urls as $url) {
      $css_content .= @file_get_contents($url);
    }
    $css_content = str_replace("\r\n", '', $css_content); //清除换行符
    $css_content = str_replace("\n", '', $css_content); //清除换行符
    $css_content = str_replace("\t", '', $css_content); //清除制表符
    $css_content = str_replace("../images/", "./../common/images/", $css_content);
    @file_put_contents($css_url, $css_content);
  }
  $css_url = str_replace(FCPATH, '', $css_url);
  return $css_url;
}
/**
*  合并压缩js
*/
function parse_script($urls)
{
  $url = md5(implode(',', $urls));
  $path = FCPATH. '/static/parse/';
  $js_url = $path . $url . '.js';
  if (!file_exists($js_url)) {
    if (!file_exists($path))
      mkdir($path, 0777);
    load_qy_lib('JavaScriptPacker');
    $js_content = '';
    foreach ($urls as $url) {
      $append_content = @file_get_contents($url) . "\r\n";
      $packer = new JavaScriptPacker($append_content);
      $append_content = $packer->_basicCompression($append_content);
      $js_content .= $append_content;
    }
    @file_put_contents($js_url, $js_content);
  }
  $js_url = str_replace(FCPATH, '', $js_url);
  return $js_url;
}

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

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

/**
 * 9 April 2008. version 1.1
 *
 * This is the php version of the Dean Edwards JavaScript's Packer,
 * Based on :
 *
 * ParseMaster, version 1.0.2 (2005-08-19) Copyright 2005, Dean Edwards
 * a multi-pattern parser.
 * KNOWN BUG: erroneous behavior when using escapeChar with a replacement
 * value that is a function
 *
 * packer, version 2.0.2 (2005-08-19) Copyright 2004-2005, Dean Edwards
 *
 * License: http://creativecommons.org/licenses/LGPL/2.1/
 *
 * Ported to PHP by Nicolas Martin.
 *
 * ----------------------------------------------------------------------
 * changelog:
 * 1.1 : correct a bug, '\0' packed then unpacked becomes '\'.
 * ----------------------------------------------------------------------
 *
 * Changes:
 * 2014-08-28: grkalik: change class for composer support. no functionality change.
 *
 */
PHP 相关文章推荐
web方式ftp
Oct 09 PHP
discuz Passport 通行证 整合笔记
Jun 30 PHP
PHP无法访问远程mysql的问题分析及解决
May 16 PHP
浅析使用Turck-mmcache编译来加速、优化PHP代码
Jun 20 PHP
解析PHP中VC6 X86和VC9 X86的区别及 Non Thread Safe的意思
Jun 28 PHP
PHP中获取时间的下一周下个月的方法
Mar 18 PHP
php中实现精确设置session过期时间的方法
Jul 17 PHP
Laravel框架中实现使用阿里云ACE缓存服务
Feb 10 PHP
PHP+MySQL实现的简单投票系统实例
Feb 24 PHP
phpMyAdmin无法登陆的解决方法
Apr 27 PHP
PHP CURL与java http使用方法详解
Jan 26 PHP
PHP设计模式之注册树模式分析
Jan 26 PHP
Yii2框架数据验证操作实例详解
May 02 #PHP
Yii2框架类自动加载机制实例分析
May 02 #PHP
PHP通过bypass disable functions执行系统命令的方法汇总
May 02 #PHP
购物车实现的几种方式优缺点对比
May 02 #PHP
PHP生成(支持多模板)二维码海报代码
Apr 30 #PHP
PHP实现的猴王算法(猴子选大王)示例
Apr 30 #PHP
PHP+MySQL高并发加锁事务处理问题解决方法
Apr 30 #PHP
You might like
PHP获取当前日期和时间及格式化方法参数
2015/05/11 PHP
js停止输出代码
2008/07/20 Javascript
javascript中日期转换成时间戳的小例子
2013/03/21 Javascript
JS实现模仿微博发布效果实例代码
2013/12/16 Javascript
jQuery防止click双击多次提交及传递动态函数或多参数
2014/04/02 Javascript
jQuery插件开发的五种形态小结
2015/03/04 Javascript
jQuery实现表格展开与折叠的方法
2015/05/04 Javascript
Bootstrap每天必学之附加导航(Affix)插件
2016/04/25 Javascript
JS简单实现仿百度控制台输出信息效果
2016/09/04 Javascript
JS 全屏和退出全屏详解及实例代码
2016/11/07 Javascript
Vue.js第四天学习笔记
2016/12/02 Javascript
Vue.js中轻松解决v-for执行出错的三个方案
2017/06/09 Javascript
vue脚手架中配置Sass的方法
2018/01/04 Javascript
jQuery简单实现的HTML页面文本框模糊匹配查询功能完整示例
2018/05/09 jQuery
Vue2.0仿饿了么webapp单页面应用详细步骤
2018/07/08 Javascript
利用Blob进行文件上传的完整步骤
2018/08/02 Javascript
javascript实现点击小图显示大图
2020/11/29 Javascript
[53:13]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS LGD-GAMING
2014/05/22 DOTA
[01:04:01]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS DT第一场
2014/05/24 DOTA
[01:21]2018DOTA2亚洲邀请赛4.5采访 打DOTA2也能有女朋友?
2018/04/06 DOTA
Python 文件读写操作实例详解
2014/03/12 Python
Python的面向对象编程方式学习笔记
2016/07/12 Python
浅谈Python脚本开头及导包注释自动添加方法
2018/10/27 Python
python实现对指定字符串补足固定长度倍数截断输出的方法
2018/11/15 Python
Python字符串处理的8招秘籍(小结)
2019/08/13 Python
pandas和spark dataframe互相转换实例详解
2020/02/18 Python
python 通过文件夹导入包的操作
2020/06/01 Python
Python3开发环境搭建详细教程
2020/06/18 Python
用HTML5中的Canvas结合公式绘制粒子运动的教程
2015/05/08 HTML / CSS
详解如何将 Canvas 绘制过程转为视频
2021/01/25 HTML / CSS
老师自我鉴定范文
2013/12/25 职场文书
内蒙古鄂尔多斯市市长寄语
2014/04/10 职场文书
群众路线个人整改措施
2014/10/24 职场文书
2014年食品安全工作总结
2014/12/04 职场文书
会议主持人开场白台词
2015/05/28 职场文书
新店开业策划方案怎么书写?
2019/07/05 职场文书