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下过滤HTML代码的函数
Dec 10 PHP
php文字水印和php图片水印实现代码(二种加水印方法)
Dec 25 PHP
ThinkPHP访问不存在的模块跳转到404页面的方法
Jun 19 PHP
mantis安装、配置和使用中的问题小结
Jul 14 PHP
PHP命令行脚本接收传入参数的三种方式
Aug 20 PHP
php将12小时制转换成24小时制的方法
Mar 31 PHP
WIFI万能钥匙密码查询接口实例
Sep 28 PHP
phalcon框架使用指南
Feb 23 PHP
PHP+shell脚本操作Memcached和Apache Status的实例分享
Mar 11 PHP
php中static 静态变量和普通变量的区别
Dec 01 PHP
利用php-cli和任务计划实现订单同步功能的方法
May 03 PHP
浅谈laravel框架sql中groupBy之后排序的问题
Oct 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
星际RPG字典
2020/03/04 星际争霸
解析thinkphp import 文件内容变量失效的问题
2013/06/20 PHP
ThinkPHP模板IF标签用法详解
2014/07/01 PHP
PHP中遇到BOM、编码导致json_decode函数无法解析问题
2014/07/02 PHP
php实现QQ空间获取当前用户的用户名并生成图片
2015/07/25 PHP
prettify 代码高亮着色器google出品
2010/12/28 Javascript
JavaScript:new 一个函数和直接调用函数的区别分析
2013/07/10 Javascript
jQuery中closest()函数用法实例
2015/01/07 Javascript
基于JavaScript代码实现微信扫一扫下载APP
2015/12/30 Javascript
Hammer.js+轮播原理实现简洁的滑屏功能
2016/02/02 Javascript
javascript实现动态显示颜色块的报表效果
2017/04/10 Javascript
详解vue表单验证组件 v-verify-plugin
2017/04/19 Javascript
全面解析vue中的数据双向绑定
2017/05/10 Javascript
node通过express搭建自己的服务器
2017/09/30 Javascript
详解Angular5 服务端渲染实战
2018/01/04 Javascript
jQuery+Cookie实现切换皮肤功能【附源码下载】
2018/03/25 jQuery
js代码规范之Eslint安装与配置详解
2018/09/08 Javascript
Vue和React组件之间的传值方式详解
2019/01/31 Javascript
JS代码检查工具ESLint介绍与使用方法
2020/02/04 Javascript
[04:09]2014DOTA2国际邀请赛Ti西雅图 历届冠军相继出局 BBC综述今日比赛
2014/07/20 DOTA
python多进程共享变量
2016/04/06 Python
python读取中文txt文本的方法
2018/04/12 Python
Pandas Shift函数的基础入门学习笔记
2018/11/16 Python
pandas中的series数据类型详解
2019/07/06 Python
Django Rest framework认证组件详细用法
2019/07/25 Python
用Python解数独的方法示例
2019/10/24 Python
Tensorflow 模型转换 .pb convert to .lite实例
2020/02/12 Python
termux中matplotlib无法显示中文问题的解决方法
2021/01/11 Python
倩碧香港官方网站:Clinique香港
2017/11/13 全球购物
ESDlife健康生活易:身体检查预订、搜寻及比较
2019/05/10 全球购物
GC是什么?为什么要有GC?
2013/12/08 面试题
二年级数学教学反思
2014/01/21 职场文书
园艺师求职信
2014/04/27 职场文书
初中生300字旷课检讨书
2014/11/19 职场文书
2016年社区服务活动总结
2016/04/06 职场文书
2019年世界儿童日宣传标语
2019/11/22 职场文书