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 相关文章推荐
dedecms后台验证码总提示错误的解决方法
Mar 21 PHP
海河写的 Discuz论坛帖子调用js的php代码
Aug 23 PHP
php 函数使用方法与函数定义方法
May 09 PHP
PHP Session_Regenerate_ID函数双释放内存破坏漏洞
Jan 27 PHP
PHP源码之explode使用说明
Aug 05 PHP
百度地图经纬度转换到腾讯地图/Google 对应的经纬度
Aug 28 PHP
php array_udiff_assoc 计算两个数组的差集实例
Nov 12 PHP
thinkphp自定义权限管理之名称判断方法
Apr 01 PHP
PHP使用xpath解析XML的方法详解
May 20 PHP
PHP基于递归实现的约瑟夫环算法示例
Aug 27 PHP
php常用字符串长度函数strlen()与mb_strlen()用法实例分析
Jun 25 PHP
imagettftext() 失效,不起作用
Mar 09 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
使用 MySQL Date/Time 类型
2008/03/26 PHP
让codeigniter与swfupload整合的最佳解决方案
2014/06/12 PHP
php数组排序usort、uksort与sort函数用法
2014/11/17 PHP
Laravel 5框架学习之日期,Mutator 和 Scope
2015/04/08 PHP
PHP中“=&gt;
2019/03/01 PHP
几个比较经典常用的jQuery小技巧
2010/03/01 Javascript
js的逻辑运算符 ||
2010/05/31 Javascript
JS实现仿百度输入框自动匹配功能的示例代码
2014/02/19 Javascript
jQuery中:checkbox选择器用法实例
2015/01/03 Javascript
javascript使用avalon绑定实现checkbox全选
2015/05/06 Javascript
利用JQuery写一个简单的异步分页插件
2016/03/07 Javascript
深入浅析Extjs中store分组功能的使用方法
2016/04/20 Javascript
vue中$refs的用法及作用详解
2018/04/24 Javascript
Python itertools模块详解
2015/05/09 Python
Python的Django框架中从url中捕捉文本的方法
2015/07/20 Python
python+Django+apache的配置方法详解
2016/06/01 Python
Django 浅谈根据配置生成SQL语句的问题
2018/05/29 Python
django Serializer序列化使用方法详解
2018/10/16 Python
python可视化实现KNN算法
2019/10/16 Python
浅谈Python3实现两个矩形的交并比(IoU)
2020/01/18 Python
文件上传服务器-jupyter 中python解压及压缩方式
2020/04/22 Python
Django前后端分离csrf token获取方式
2020/12/25 Python
CSS Grid布局教程之浏览器开启CSS Grid Layout汇总
2014/12/30 HTML / CSS
css3 伪类选择器快速复习小结
2019/09/10 HTML / CSS
韩国休闲女装品牌网站:ANAIS
2016/08/24 全球购物
护士自荐信
2013/10/25 职场文书
函授毕业自我鉴定
2013/12/19 职场文书
会计专业自我鉴定范文
2013/12/29 职场文书
安全承诺书格式
2014/05/21 职场文书
2014年电厂个人工作总结
2014/11/27 职场文书
2014企业年终工作总结
2014/12/23 职场文书
小学生光盘行动倡议书
2015/04/28 职场文书
2016入党积极分子心得体会
2016/01/06 职场文书
2016教师廉洁教育心得体会
2016/01/13 职场文书
《蟋蟀的住宅》教学反思
2016/02/17 职场文书
导游词之山东红叶谷
2019/10/31 职场文书