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 相关文章推荐
提升PHP执行速度全攻略(下)
Oct 09 PHP
PHP实现多服务器session共享之NFS共享的方法
Mar 16 PHP
PHP 字符截取 解决中文的截取问题,不用mb系列
Sep 29 PHP
使用PHP强制下载PDF文件示例
Jan 17 PHP
PHP中soap的用法实例
Oct 24 PHP
基于PHP实现的事件机制实例分析
Jun 18 PHP
php实现简易聊天室应用代码
Sep 23 PHP
PHP图像裁剪缩略裁切类源码及使用方法
Jan 07 PHP
彻底搞懂PHP 变量结构体
Oct 11 PHP
php实现生成带二维码图片并强制下载功能
Feb 24 PHP
YII框架http缓存操作示例
Apr 29 PHP
Laravel 添加多语言提示信息的方法
Sep 29 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大批量插入数据库的3种方法和速度对比
2014/07/08 PHP
让ie运行js时提示允许阻止内容运行的解决方法
2010/10/24 Javascript
js类式继承的具体实现方法
2013/12/31 Javascript
含有CKEditor的表单如何提交
2014/01/09 Javascript
js判断当页面无法回退时关闭网页否则就history.go(-1)
2014/08/07 Javascript
基于Jquery实现焦点图淡出淡入效果
2015/11/30 Javascript
快速学习jQuery插件 jquery.validate.js表单验证插件使用方法
2015/12/01 Javascript
jQuery中trigger()与bind()用法分析
2015/12/18 Javascript
bootstrap导航、选项卡实现代码
2016/12/28 Javascript
使用BootStrap进行轮播图的制作
2017/01/06 Javascript
JavaScript获取URL参数的方法之一
2017/03/24 Javascript
layui弹出层效果实现代码
2017/05/19 Javascript
Vue添加请求拦截器及vue-resource 拦截器使用
2017/11/23 Javascript
React 使用browserHistory项目访问404问题解决
2018/06/01 Javascript
小程序怎样让wx.navigateBack更好用的方法实现
2019/11/01 Javascript
详解小程序BackgroundAudioManager踩坑之旅
2019/12/08 Javascript
vue实现网络图片瀑布流 + 下拉刷新 + 上拉加载更多(步骤详解)
2020/01/14 Javascript
npx create-react-app xxx创建项目报错的解决办法
2020/02/17 Javascript
Python 除法小技巧
2008/09/06 Python
Python实现简单的语音识别系统
2017/12/13 Python
Python爬虫获取整个站点中的所有外部链接代码示例
2017/12/26 Python
Python利用openpyxl库遍历Sheet的实例
2018/05/03 Python
使用anaconda的pip安装第三方python包的操作步骤
2018/06/11 Python
基于Django框架利用Ajax实现点赞功能实例代码
2018/08/19 Python
python中关于数据类型的学习笔记
2020/07/19 Python
微软俄罗斯官方网站:Microsoft俄罗斯
2016/09/18 全球购物
亚洲航空公司官方网站:AirAsia
2019/11/25 全球购物
澳大利亚美容产品及化妆品在线:Activeskin
2020/06/03 全球购物
一套英文Java笔试题面试题
2016/04/21 面试题
涉外经济法专业毕业生推荐信
2013/11/24 职场文书
销售类求职信
2014/06/13 职场文书
黄石寨导游词
2015/02/05 职场文书
幼儿园六一儿童节活动总结
2015/02/10 职场文书
2015年前台接待工作总结
2015/05/04 职场文书
Go缓冲channel和非缓冲channel的区别说明
2021/04/25 Golang
Promise静态四兄弟实现示例详解
2022/07/07 Javascript