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 zlib扩展实现页面GZIP压缩输出
Jun 17 PHP
php中计算程序运行时间的类代码
Nov 03 PHP
PHP查询数据库中满足条件的记录条数(两种实现方法)
Jan 29 PHP
phpmyadmin显示utf8_general_ci中文乱码的问题终级篇
Apr 08 PHP
Win下如何安装PHP的APC拓展
Aug 07 PHP
Session的工作机制详解和安全性问题(PHP实例讲解)
Apr 10 PHP
php+jQuery.uploadify实现文件上传教程
Dec 26 PHP
CI(CodeIgniter)模型用法实例分析
Jan 20 PHP
PHP实现微信支付(jsapi支付)流程步骤详解
Mar 15 PHP
PHP设计模式之模板方法模式定义与用法详解
Apr 02 PHP
tp5(thinkPHP5框架)使用DB实现批量删除功能示例
May 28 PHP
关于Anemometer图形化显示MySQL慢日志的工具搭建及使用的详细介绍
Jul 13 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 一个随机字符串生成代码
2010/05/26 PHP
php连接MSsql server的五种方法总结
2018/03/04 PHP
CodeIgniter框架实现的整合Smarty引擎DEMO示例
2019/03/28 PHP
laravel使用Faker数据填充的实现方法
2019/04/12 PHP
jquery $.ajax相关用法分享
2012/03/16 Javascript
深入理解JavaScript系列(26):设计模式之构造函数模式详解
2015/03/03 Javascript
JavaScript操作URL的相关内容集锦
2015/10/29 Javascript
js实现的页面矩阵图形变换特效
2016/01/26 Javascript
Query常用DIV操作获取和设置长度宽度的实现方法
2016/09/19 Javascript
jQuery给指定的table动态添加删除行的操作方法
2016/10/12 Javascript
微信小程序 加载 app-service.js 错误解决方法
2016/10/12 Javascript
js编写的treeview使用方法
2016/11/11 Javascript
使用yeoman构建angular应用的方法
2017/08/14 Javascript
基于vue-cli配置lib-flexible + rem实现移动端自适应
2017/12/26 Javascript
解决vue接口数据赋值给data没有反应的问题
2018/08/27 Javascript
VueCli3构建TS项目的方法步骤
2018/11/07 Javascript
React中获取数据的3种方法及优缺点
2020/02/18 Javascript
jQuery+Ajax+js实现请求json格式数据并渲染到html页面操作示例
2020/06/02 jQuery
Java多线程编程中ThreadLocal类的用法及深入
2016/06/21 Python
Python编程实现使用线性回归预测数据
2017/12/07 Python
python如何删除文件中重复的字段
2019/07/16 Python
Python argparse模块使用方法解析
2020/02/20 Python
scrapy框架携带cookie访问淘宝购物车功能的实现代码
2020/07/07 Python
Python 调用C++封装的进一步探索交流
2021/03/04 Python
解决canvas转base64/jpeg时透明区域变成黑色背景的方法
2016/10/23 HTML / CSS
利用Node实现HTML5离线存储的方法
2020/10/16 HTML / CSS
英国第一摩托车和摩托车越野配件商店:GhostBikes
2019/03/10 全球购物
教师党员思想汇报
2014/01/06 职场文书
收银员岗位职责
2014/02/07 职场文书
生物科学专业毕业生求职信
2014/06/02 职场文书
教育读书笔记
2015/07/02 职场文书
红十字会救护培训简讯
2015/07/20 职场文书
创业计划书之个人工作室
2019/08/22 职场文书
辞职报告(范文三篇)
2019/08/27 职场文书
血轮眼轮回眼特效 html+css
2021/03/31 HTML / CSS
MyBatis 动态SQL全面详解
2021/10/05 MySQL