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制作静态网站的模板框架
Oct 09 PHP
一个可以找出源代码中所有中文的工具
Oct 25 PHP
让PHP更快的提供文件下载的代码
Jun 13 PHP
初识laravel5
Mar 02 PHP
详解PHP实现异步调用的4种方法
Mar 14 PHP
PHP结合Ueditor并修改图片上传路径
Oct 16 PHP
Yii2数据库操作常用方法小结
May 04 PHP
php打开本地exe程序,js打开本地exe应用程序,并传递相关参数方法
Feb 06 PHP
实例介绍PHP中zip_open()函数用法
Feb 15 PHP
Yii2处理密码加密及验证的方法
May 12 PHP
Yii2.0框架模型添加/修改/删除数据操作示例
Jul 18 PHP
基于PHP的微信公众号的开发流程详解
Aug 07 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 ios推送(代码)
2013/07/01 PHP
php中如何防止表单的重复提交
2013/08/02 PHP
PHP中几个可以提高运行效率的代码写法、技巧分享
2014/08/21 PHP
php中array_multisort对多维数组排序的方法
2020/06/21 PHP
thinkphp的dump函数无输出实例代码
2016/11/15 PHP
php接口技术实例详解
2016/12/07 PHP
PHP数组与字符串互相转换实例
2020/05/05 PHP
JS DOM 操作实现代码
2010/08/01 Javascript
window.open的页面如何刷新(父页面)上层页面
2012/12/28 Javascript
jquery遍历checkbox的注意事项说明
2014/02/21 Javascript
使用JQuery库提供的扩展功能实现自定义方法
2014/09/09 Javascript
jQuery和AngularJS的区别浅析
2015/01/29 Javascript
jquery实现图片上传前本地预览功能
2016/05/10 Javascript
使用Promise解决多层异步调用的简单学习心得
2016/05/17 Javascript
详解vue-router 2.0 常用基础知识点之导航钩子
2017/05/10 Javascript
jQuery中图片展示插件highslide.js的简单dom
2018/04/22 jQuery
nodejs提示:cross-device link not permitted, rename错误的解决方法
2019/06/10 NodeJs
解决layui数据表格table的横向滚动条显示问题
2019/09/04 Javascript
解决layer弹出层msg的文字不显示的问题
2019/09/11 Javascript
[03:54]Ehome出征西雅图 回顾2016国际邀请赛晋级之路
2016/08/02 DOTA
pyqt4教程之widget使用示例分享
2014/03/07 Python
Python获取远程文件大小的函数代码分享
2014/05/13 Python
python中base64加密解密方法实例分析
2015/05/16 Python
python密码错误三次锁定(实例讲解)
2017/11/14 Python
PyTorch中Tensor的数据类型和运算的使用
2020/09/03 Python
英国高街电视:High Street TV
2018/05/22 全球购物
Nike瑞士官网:Nike CH
2021/01/18 全球购物
为什么如下的代码int a=100,b=100;long int c=a * b;不能工作
2013/11/29 面试题
工商管理实习自我鉴定
2013/09/28 职场文书
预备党员入党思想汇报
2014/01/04 职场文书
幼儿园师德演讲稿
2014/05/06 职场文书
2014高中生入党思想汇报范文
2014/09/13 职场文书
四风查摆剖析材料
2014/10/10 职场文书
会计实训报告范文
2014/11/04 职场文书
优秀班集体事迹材料
2014/12/25 职场文书
Django利用AJAX技术实现博文实时搜索
2021/05/06 Python