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 相关文章推荐
第十二节 类的自动加载 [12]
Oct 09 PHP
攻克CakePHP系列一 连接MySQL数据库
Oct 22 PHP
基于php socket(fsockopen)的应用实例分析
Jun 02 PHP
小谈php正则提取图片地址
Mar 27 PHP
PHP的fsockopen、pfsockopen函数被主机商禁用的解决办法
Jul 08 PHP
php异步多线程swoole用法实例
Nov 14 PHP
PHP CURL 内存泄露问题解决方法
Feb 12 PHP
两种php去除二维数组的重复项方法
Nov 04 PHP
php安全配置记录和常见错误梳理(总结)
Mar 28 PHP
PHP+Ajax实现上传文件进度条动态显示进度功能
Jun 04 PHP
Thinkphp5.0 框架使用模型Model添加、更新、删除数据操作详解
Oct 11 PHP
PHP大文件及断点续传下载实现代码
Aug 18 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
再Docker中架设完整的WordPress站点全攻略
2015/07/29 PHP
php项目开发中用到的快速排序算法分析
2016/06/25 PHP
Yii全局函数用法示例
2017/01/22 PHP
php实现基于pdo的事务处理方法示例
2017/07/21 PHP
PHP商品秒杀问题解决方案实例详解【mysql与redis】
2019/07/22 PHP
用JavaScript玩转游戏物理(一)运动学模拟与粒子系统
2010/06/19 Javascript
js数组Array sort方法使用深入分析
2013/02/21 Javascript
使用Node.js实现一个简单的FastCGI服务器实例
2014/06/09 Javascript
node.js中的http.response.write方法使用说明
2014/12/14 Javascript
简单谈谈Javascript中类型的判断
2015/10/19 Javascript
老生常谈JavaScript数组的用法
2016/06/10 Javascript
JavaScript中String对象的方法介绍
2017/01/04 Javascript
微信小程序实战之顶部导航栏(选项卡)(1)
2020/06/19 Javascript
用ES6写全屏滚动插件的示例代码
2018/05/02 Javascript
微信小程序页面滚动到指定位置代码实例
2019/09/07 Javascript
python中函数默认值使用注意点详解
2016/06/01 Python
分享python数据统计的一些小技巧
2016/07/21 Python
由浅入深讲解python中的yield与generator
2017/04/05 Python
在Pycharm中修改文件默认打开方式的方法
2019/01/17 Python
python爬虫之快速对js内容进行破解
2019/07/09 Python
10个Python面试常问的问题(小结)
2019/11/20 Python
纯CSS改变webkit内核浏览器的滚动条样式
2014/04/17 HTML / CSS
MAC Cosmetics巴西官方网站:M·A·C彩妆
2019/04/18 全球购物
政法学院毕业生求职信
2014/02/28 职场文书
股权收购意向书
2014/04/01 职场文书
集中采购方案
2014/06/10 职场文书
2014领导干部学习焦裕禄同志先进事迹思想汇报
2014/09/19 职场文书
村党支部对照检查材料思想汇报
2014/09/28 职场文书
2015年音乐教师个人工作总结
2015/05/20 职场文书
PHP中->和=>的意思
2021/03/31 PHP
Nginx配置80端口访问8080及项目名地址方法解析
2021/03/31 Servers
如何将numpy二维数组中的np.nan值替换为指定的值
2021/05/14 Python
Python机器学习之底层实现KNN
2021/06/20 Python
Python使用PyYAML库读写yaml文件的方法
2022/04/06 Python
vue封装数字翻牌器
2022/04/20 Vue.js
详解MongoDB排序时内存大小限制与创建索引的注意事项
2022/05/06 MongoDB