Combo Script自動合併/壓縮腳本
完整程式碼下載:
http://www.ctdisk.com/file/9402163
腳本使用:
- 要求php5以上版本
- 程式在找不到本機檔案的情況下,會去指定的cdn上找同名文件
- 程式會自動轉義-min文件為來源文件,因此要約定-min文件和原文件要成對出現
- 需要定義combo.php和minify.php中的$YOUR_CDN變量
- 如果只是合併壓縮local文件,則不必重置$YOUR_CDN變量
- 這裡提供cb.php,用來實作tbcdn的開發環境的模擬,apache的配置在cb.php中
合併文件
- http://yourdomain.com/combo.php?app/js/1.js&app/js/2.js
合併壓縮
- http://yourdomain.com/minify.php?app/js/1.js&app/js/2.js
模擬淘寶CDN
- http://a.tbcdn.cn/??1.js,2.js
- http://a.tbcdn.cn/subdir/??1/js,2.js
文件列表:
- combo.php 合併文件,不壓縮
- minify.php 合併壓縮文件
- cssmin.php 壓縮css
- jsmin.php 壓縮js
- cb.php 淘寶CDN合併檔案策略的模擬
css實例
js實例
php檔案編碼統一使用utf-8
-
/* 壓縮*/
- $MINIFY = true;
- /* 預設cdn位址*/
- $YOUR_CDN = 'http: //a.tbcdn.cn/';
-
- require 'jsmin.php';
- require 'cssmin.php';
- /**
- * 設定電子標籤快取
- */
- function cache( $etag){
- $etag = $etag; //標記字串,可以任意修改
- if ($_SERVER['HTTP_IF_NONE_MATCH'] == $etag){
- header('Etag:'. $etag,true,304);
- exit;
- }
- else header('Etag:'.$etag);
- }
-
- function get_contents($url){
- $ch =curl_init($url);
- curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $ 🎜> curl_close($ch);
- if ($str !==false) {
- return $str;
- }else {
- return '';
- }
- }
-
- //得到副檔名
- function get_extend($file_name) {
- $extend =explode("." , $file_name);
- $va=count($extend)-1;
- return $extend[$va];
- }
-
- /**
- * 邏輯開始
- */
- $files = array();
- //cdn上存在的各種可能的檔案類型
- $header = array(
- 'js' => 'Content-Type: application/x-javascript',
- 'css' => 'Content-Type: text/css',
- 'jpg' => 'Content-Type: image/jpg',
- 'gif' => 'Content-Type: image/gif',
- 'png' => 'Content-Type: image /png',
- 'jpeg' => 'Content-Type: image/jpeg',
- 'swf' => 'Content-Type: application/x-shockwave-flash'
- );
- $type = '';
- foreach ($_GET as $k => $v) {
- //最常見的替換規則
- $k = preg_replace(
- array('/_( js|css|gif|png|jpg|jpeg|swf)$/','/yui/2_8_0r4/','/yui/3_0_0/','/(d+)_(d+)_(d+)/', '/(d+)_(d+)/','/_v(d)/'),
- array('.$1','yui/2.8.0r4','yui/3.0.0','$1 .$2.$3','$1.$2','.v$1'),
- trim($k,'/')
- );
- //在這裡加上轉換過頭的各種情況
- $k = str_replace('global.v5.css','global_v5.css',$k);
- $k = str_replace('detail.v2.css','detail_v2.css',$k );
- $k = str_replace('cubee_combo','cubee.combo',$k);
-
- if(empty($type)) {
- $type = get_extend($k) ;
- }
- //檔案存在
- if(file_exists($k)) {
- $in_str = file_get_contents($k);
- //處理文字
- if(preg_match( '/js|css/',$type)){
- //$files[] = file_get_contents($k);
- if($MINIFY == true && $type == 'js'){
- $files[] = JSMin::minify($in_str);
- }else if($MINIFY == true && $type == 'css'){
- $files[] = cssmin::minify ($in_str);
- }else{
- $files[] = $in_str;
- }
- }else{
- //處理非文字
- $files[] = array( $in_str);
- }
- }else{
- //檔案不存在
- $in_sta = file($YOUR_CDN.$k);
- //文字的處理
- if( preg_match('/js|css/',$type)){
- $files[] = '/* http://a.tbcdn.cn/'.$k.' */';
- $ inner_str = join('',$in_sta);
- if($MINIFY == true && $type == 'js'){
- $files[] = JSMin::minify($inner_str);
- }else if($MINIFY == true && $type == 'css'){
- $files[] = cssmin::minify($inner_str);
- }else{
- $files[] = $inner_str;
- }
- }else{
- //非文字的處理
- $files[] = $in_sta;
- }
- }
- }
-
- header("Expires: " . date("D, j M Y H:i:s", strtotime("now + 10 years")) ." GMT");
- //文本的處理
- header ($header[$type]);//檔案類型
- if(preg_match('/js|css/',$type)){
- $result = join("",$files);
- }else{
- //非文字的處理
- $result = join("",$files[0]);
- }
- cache(md5($result));//etag ,處理Etag是否多餘?
- echo $result;
- ?>
-
-
複製程式碼
|