首頁  >  文章  >  後端開發  >  Combo Script自動合併/壓縮腳本 仿淘寶

Combo Script自動合併/壓縮腳本 仿淘寶

WBOY
WBOY原創
2016-07-25 09:02:17912瀏覽
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
  1. /* 壓縮*/
  2. $MINIFY = true;
  3. /* 預設cdn位址*/
  4. $YOUR_CDN = 'http: //a.tbcdn.cn/';
  5. require 'jsmin.php';
  6. require 'cssmin.php';
  7. /**
  8. * 設定電子標籤快取
  9. */
  10. function cache( $etag){
  11. $etag = $etag; //標記字串,可以任意修改
  12. if ($_SERVER['HTTP_IF_NONE_MATCH'] == $etag){
  13. header('Etag:'. $etag,true,304);
  14. exit;
  15. }
  16. else header('Etag:'.$etag);
  17. }
  18. function get_contents($url){
  19. $ch =curl_init($url);
  20. curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
  21. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $ 🎜> curl_close($ch);
  22. if ($str !==false) {
  23. return $str;
  24. }else {
  25. return '';
  26. }
  27. }
  28. //得到副檔名
  29. function get_extend($file_name) {
  30. $extend =explode("." , $file_name);
  31. $va=count($extend)-1;
  32. return $extend[$va];
  33. }
  34. /**
  35. * 邏輯開始
  36. */
  37. $files = array();
  38. //cdn上存在的各種可能的檔案類型
  39. $header = array(
  40. 'js' => 'Content-Type: application/x-javascript',
  41. 'css' => 'Content-Type: text/css',
  42. 'jpg' => 'Content-Type: image/jpg',
  43. 'gif' => 'Content-Type: image/gif',
  44. 'png' => 'Content-Type: image /png',
  45. 'jpeg' => 'Content-Type: image/jpeg',
  46. 'swf' => 'Content-Type: application/x-shockwave-flash'
  47. );
  48. $type = '';
  49. foreach ($_GET as $k => $v) {
  50. //最常見的替換規則
  51. $k = preg_replace(
  52. array('/_( js|css|gif|png|jpg|jpeg|swf)$/','/yui/2_8_0r4/','/yui/3_0_0/','/(d+)_(d+)_(d+)/', '/(d+)_(d+)/','/_v(d)/'),
  53. array('.$1','yui/2.8.0r4','yui/3.0.0','$1 .$2.$3','$1.$2','.v$1'),
  54. trim($k,'/')
  55. );
  56. //在這裡加上轉換過頭的各種情況
  57. $k = str_replace('global.v5.css','global_v5.css',$k);
  58. $k = str_replace('detail.v2.css','detail_v2.css',$k );
  59. $k = str_replace('cubee_combo','cubee.combo',$k);
  60. if(empty($type)) {
  61. $type = get_extend($k) ;
  62. }
  63. //檔案存在
  64. if(file_exists($k)) {
  65. $in_str = file_get_contents($k);
  66. //處理文字
  67. if(preg_match( '/js|css/',$type)){
  68. //$files[] = file_get_contents($k);
  69. if($MINIFY == true && $type == 'js'){
  70. $files[] = JSMin::minify($in_str);
  71. }else if($MINIFY == true && $type == 'css'){
  72. $files[] = cssmin::minify ($in_str);
  73. }else{
  74. $files[] = $in_str;
  75. }
  76. }else{
  77. //處理非文字
  78. $files[] = array( $in_str);
  79. }
  80. }else{
  81. //檔案不存在
  82. $in_sta = file($YOUR_CDN.$k);
  83. //文字的處理
  84. if( preg_match('/js|css/',$type)){
  85. $files[] = '/* http://a.tbcdn.cn/'.$k.' */';
  86. $ inner_str = join('',$in_sta);
  87. if($MINIFY == true && $type == 'js'){
  88. $files[] = JSMin::minify($inner_str);
  89. }else if($MINIFY == true && $type == 'css'){
  90. $files[] = cssmin::minify($inner_str);
  91. }else{
  92. $files[] = $inner_str;
  93. }
  94. }else{
  95. //非文字的處理
  96. $files[] = $in_sta;
  97. }
  98. }
  99. }
  100. header("Expires: " . date("D, j M Y H:i:s", strtotime("now + 10 years")) ." GMT");
  101. //文本的處理
  102. header ($header[$type]);//檔案類型
  103. if(preg_match('/js|css/',$type)){
  104. $result = join("",$files);
  105. }else{
  106. //非文字的處理
  107. $result = join("",$files[0]);
  108. }
  109. cache(md5($result));//etag ,處理Etag是否多餘?
  110. echo $result;
  111. ?>
複製程式碼
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn