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+mysql实现无限级分类 | 树型显示分类关系
Nov 19 PHP
Yii中CGridView关联表搜索排序方法实例详解
Dec 03 PHP
php读取csv数据保存到数组的方法
Jan 03 PHP
ajax+php控制所有后台函数调用
Jul 15 PHP
Thinkphp微信公众号支付接口
Aug 04 PHP
CodeIgniter框架常见用法工作总结
Mar 16 PHP
Yii框架批量插入数据扩展类的简单实现方法
May 23 PHP
php调用云片网接口发送短信的实现方法
Oct 25 PHP
PHP结合Vue实现滚动底部加载效果
Dec 17 PHP
Yii2 中实现单点登录的方法
Mar 09 PHP
PHP实现的mongoDB数据库操作类完整实例
Apr 10 PHP
Linux下源码包安装Swoole及基本使用操作图文详解
Apr 02 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
星际争霸 Starcraft 游戏介绍
2020/03/14 星际争霸
咖啡的传说和历史
2021/03/03 新手入门
php 无极分类(递归)实现代码
2010/01/05 PHP
php 字符串压缩方法比较示例
2014/01/23 PHP
PHP循环结构实例讲解
2014/02/10 PHP
微信开发之网页授权获取用户信息(二)
2016/01/08 PHP
PHP培训要多少钱
2017/06/06 PHP
PHP基于进程控制函数实现多线程
2020/12/09 PHP
jQuery学习笔记之Helloworld
2010/12/22 Javascript
浅析js中的浮点型运算问题
2014/01/06 Javascript
深入理解JavaScript系列(31):设计模式之代理模式详解
2015/03/03 Javascript
jQuery使用after()方法在元素后面添加多项内容的方法
2015/03/26 Javascript
浅谈node.js中async异步编程
2015/10/22 Javascript
JavaScript电子时钟倒计时
2016/01/09 Javascript
js生成随机数(指定范围)的实例代码
2016/07/10 Javascript
jQuery实现动态文字搜索功能
2017/01/05 Javascript
NodeJs下的测试框架Mocha的简单介绍
2017/02/22 NodeJs
JavaScript对象拷贝与赋值操作实例分析
2018/12/10 Javascript
小程序实现左右来回滚动字幕效果
2018/12/28 Javascript
详解JavaScript修改注册表的方法
2020/01/05 Javascript
python去除空格和换行符的实现方法(推荐)
2017/01/04 Python
python每天定时运行某程序代码
2019/08/16 Python
python线程定时器Timer实现原理解析
2019/11/30 Python
python报错TypeError: ‘NoneType‘ object is not subscriptable的解决方法
2020/11/05 Python
五款漂亮的纯CSS3动画按钮的实例教程
2014/11/21 HTML / CSS
荷兰网上鞋店:Ziengs.nl
2017/01/02 全球购物
Bally美国官网:经典瑞士鞋履、手袋及配饰奢侈品牌
2018/05/18 全球购物
英国和国际包裹递送:ParcelCompare
2019/08/26 全球购物
Opodo意大利:欧洲市场上领先的在线旅行社
2019/10/24 全球购物
写一个函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度
2015/11/18 面试题
会计系中文个人求职信
2013/12/24 职场文书
基层党员对照检查材料
2014/08/25 职场文书
大学团日活动新闻稿
2014/09/10 职场文书
委托证明书
2014/09/17 职场文书
2015年毕业生自荐信范文
2015/03/24 职场文书
聘任通知书
2015/09/21 职场文书