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 include,include_once,require,require_once
Sep 05 PHP
ajax+php打造进度条代码[readyState各状态说明]
Apr 12 PHP
php下统计用户在线时间的一种尝试
Aug 26 PHP
PHP中去掉字符串首尾空格的方法
May 19 PHP
php图片的裁剪与缩放生成符合需求的缩略图
Jan 11 PHP
PHP URL参数获取方式的四种例子
Feb 28 PHP
PHP中ltrim与rtrim去除左右空格及特殊字符实例
Jan 07 PHP
浅谈PHP值mysql操作类
Jun 29 PHP
CI框架实现框架前后端分离的方法详解
Dec 30 PHP
PHP接口继承及接口多继承原理与实现方法详解
Oct 18 PHP
PHP实现简易用户登录系统
Jul 10 PHP
如何理解PHP核心特性命名空间
May 28 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/01/24 PHP
JQuery打造PHP的AJAX表单提交实例
2009/11/03 Javascript
javascript变量作用域使用中常见错误总结
2013/03/26 Javascript
js函数setTimeout延迟执行的简单介绍
2013/07/17 Javascript
父页面显示遮罩层弹出半透明状态的dialog
2014/03/04 Javascript
form.submit()不能提交表单的原因分析
2014/10/23 Javascript
Javascript中的call()方法介绍
2015/03/15 Javascript
VUEJS实战之利用laypage插件实现分页(3)
2016/06/13 Javascript
AngularJs表单验证实例代码解析
2016/11/29 Javascript
jquery实现轮播图效果
2017/02/13 Javascript
详解使用vue-router进行页面切换时滚动条位置与滚动监听事件
2017/03/08 Javascript
VUE实现表单元素双向绑定(总结)
2017/08/08 Javascript
JS轮播图实现简单代码
2021/02/19 Javascript
jQuery UI实现动画效果代码分享
2018/08/19 jQuery
vue2.0 下拉框默认标题设置方法
2018/08/22 Javascript
JavaScript解析机制与闭包原理实例详解
2019/03/08 Javascript
vue下使用nginx刷新页面404的问题解决
2019/08/02 Javascript
Node.js设置定时任务之node-schedule模块的使用详解
2020/04/28 Javascript
JS求解两数之和算法详解
2020/04/28 Javascript
学习 Vue.js 遇到的那些坑
2021/02/02 Vue.js
Python pickle模块用法实例
2015/04/14 Python
利用python如何处理nc数据详解
2018/05/23 Python
python UDP(udp)协议发送和接收的实例
2019/07/22 Python
python协程gevent案例 爬取斗鱼图片过程解析
2019/08/27 Python
Django实现网页分页功能
2019/10/31 Python
python中for in的用法详解
2020/04/17 Python
Python虚拟环境venv用法详解
2020/05/25 Python
HTML5头部标签的一些常用信息小结
2016/10/23 HTML / CSS
sort命令的作用和用法
2012/11/04 面试题
个人简历自我评价八例
2013/10/31 职场文书
企业形象策划方案
2014/05/29 职场文书
2014年基层党建工作总结
2014/11/11 职场文书
青年教师个人总结
2015/02/11 职场文书
安全生产协议书
2016/03/22 职场文书
MySQL Innodb索引机制详细介绍
2021/11/23 MySQL
python运算符之与用户交互
2022/04/13 Python