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类
Nov 27 PHP
php基础知识:函数基础知识
Dec 13 PHP
ubuntu 编译安装php 5.3.3+memcache的方法
Aug 05 PHP
php和mysql中uft-8中文编码乱码的几种解决办法
Apr 19 PHP
php中print(),print_r(),echo()的区别详解
Dec 01 PHP
PHP正则表达式入门教程(推荐)
May 18 PHP
浅析PHP中的i++与++i的区别及效率
Jun 15 PHP
php array_slice 取出数组中的一段序列实例
Nov 04 PHP
探究Laravel使用env函数读取环境变量为null的问题
Dec 06 PHP
yii2实现分页,带搜索的分页功能示例
Jan 07 PHP
PHP的mysqli_sqlstate()函数讲解
Jan 23 PHP
phpStorm2020 注册码
Sep 17 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实现适用于自定义的验证码类
2016/06/15 PHP
php处理单文件、多文件上传代码分享
2016/08/24 PHP
巧妙破除网页右键禁用的十大绝招
2006/08/12 Javascript
在线游戏大家来找茬II
2006/09/30 Javascript
Javascript 获取字符串字节数的多种方法
2009/06/02 Javascript
页面中body onload 和 window.onload 冲突的问题的解决
2009/07/01 Javascript
jQuery 获取对象 定位子对象
2010/05/31 Javascript
js限制文本框只能输入数字(正则表达式)
2012/07/15 Javascript
JAVASCRIPT模式窗口中下载文件无法接收iframe的流
2013/10/11 Javascript
node.js中的path.join方法使用说明
2014/12/08 Javascript
JavaScript实现查找字符串中第一个不重复的字符
2014/12/29 Javascript
JavaScript+canvas实现七色板效果实例
2016/02/18 Javascript
javascript容错处理代码(屏蔽js错误)
2017/01/20 Javascript
docker中编译nodejs并使用nginx启动
2017/06/23 NodeJs
9种改善AngularJS性能的方法
2017/11/28 Javascript
浅谈AngularJs 双向绑定原理(数据绑定机制)
2017/12/07 Javascript
详解javascript 正则表达式之分组与前瞻匹配
2018/05/30 Javascript
jQuery 实现批量提交表格多行数据的方法
2018/08/09 jQuery
jQuery 点击获取验证码按钮及倒计时功能
2018/09/20 jQuery
js实现动态添加上传文件页面
2018/10/22 Javascript
在 Vue 应用中使用 Netlify 表单功能的方法详解
2019/06/03 Javascript
nodejs提示:cross-device link not permitted, rename错误的解决方法
2019/06/10 NodeJs
Python中with及contextlib的用法详解
2017/06/08 Python
Python进阶之递归函数的用法及其示例
2018/01/31 Python
详谈Python 窗体(tkinter)表格数据(Treeview)
2018/10/11 Python
Gap工厂店:Gap Factory
2017/11/02 全球购物
trivago美国:全球最大的酒店价格比较网站
2018/01/18 全球购物
大学生关于奋斗的演讲稿
2014/01/09 职场文书
在校生自我鉴定
2014/01/23 职场文书
银行柜员求职自荐书
2014/06/18 职场文书
学生会感恩节活动方案
2014/10/11 职场文书
幼儿园小班见习报告
2014/10/31 职场文书
逃课检讨书
2015/01/26 职场文书
广播稿:校园广播稿范文
2019/04/17 职场文书
Python中json.dumps()函数的使用解析
2021/05/17 Python
python函数的两种嵌套方法使用
2022/04/02 Python