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 相关文章推荐
一个简单计数器的源代码
Oct 09 PHP
array_multisort实现PHP多维数组排序示例讲解
Jan 04 PHP
PHP判断搜索引擎蜘蛛并自动记忆到文件的代码
Feb 04 PHP
基于MySQL分区性能的详细介绍
May 02 PHP
如何批量替换相对地址为绝对地址(利用bat批处理实现)
May 27 PHP
利用中国天气预报接口实现简单天气预报
Jan 20 PHP
修改destoon会员公司的伪静态中的com目录的方法
Aug 21 PHP
php中fsockopen用法实例
Jan 05 PHP
php防止用户重复提交表单
Nov 02 PHP
ThinkPHP使用Ueditor的方法详解
May 20 PHP
PHP使用栈解决约瑟夫环问题算法示例
Aug 27 PHP
yii2.0框架数据库操作简单示例【添加,修改,删除,查询,打印等】
Apr 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中使用Select 查询语句的实例
2014/02/19 PHP
php求两个目录的相对路径示例(php获取相对路径)
2014/03/27 PHP
php常用数学函数汇总
2014/11/21 PHP
symfony表单与页面实现技巧
2015/01/26 PHP
php实现HTML实体编号与非ASCII字符串相互转换类实例
2016/11/02 PHP
PHP使用Curl实现模拟登录及抓取数据功能示例
2018/04/27 PHP
PHP示例演示发送邮件给某个邮箱
2019/04/03 PHP
JavaScript DOM 学习第九章 选取范围的介绍
2010/02/19 Javascript
JavaScript 学习初步 入门教程
2010/03/25 Javascript
整理一些JavaScript的IE和火狐的兼容性注意事项
2011/03/17 Javascript
javascript实现上传图片并预览的效果实现代码
2011/04/11 Javascript
ASP.NET jQuery 实例8 (动态添加内容到DropDownList)
2012/02/03 Javascript
Jquery实现兼容各大浏览器的Enter回车切换输入焦点的方法
2014/09/01 Javascript
使用javascript实现简单的选项卡切换
2015/01/09 Javascript
js获取html的span标签的值方法(超简单)
2016/07/26 Javascript
浅谈js基本数据类型和typeof
2016/08/09 Javascript
深入浅析Vue中的 computed 和 watch
2018/06/06 Javascript
详解基于Vue2.0实现的移动端弹窗(Alert, Confirm, Toast)组件
2018/08/02 Javascript
vue微信分享出来的链接点开是首页问题的解决方法
2018/11/28 Javascript
JavaScript实现字符串与HTML格式相互转换
2020/03/17 Javascript
快速解决安装python没有scripts文件夹的问题
2018/04/03 Python
Python中staticmethod和classmethod的作用与区别
2018/10/11 Python
python实现Flappy Bird源码
2018/12/24 Python
python处理“
2019/06/10 Python
浅谈pytorch池化maxpool2D注意事项
2020/02/18 Python
python实现从ftp服务器下载文件
2020/03/03 Python
Django Serializer HiddenField隐藏字段实例
2020/03/31 Python
python 星号(*)的多种用途
2020/09/21 Python
基于python的opencv图像处理实现对斑马线的检测示例
2020/11/29 Python
基于 HTML5 WebGL 实现的垃圾分类系统
2019/10/08 HTML / CSS
经典c++面试题三
2015/07/08 面试题
高中生物教学反思
2014/02/05 职场文书
党校培训自我鉴定范文
2014/03/20 职场文书
食品流通安全承诺书
2014/05/22 职场文书
小学生一分钟演讲稿
2014/08/26 职场文书
基于Go语言构建RESTful API服务
2021/07/25 Golang