PageRenderTime 49ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 0ms

/libs/smartoptimizer/index.php

https://github.com/vik-off/framework
PHP | 213 lines | 135 code | 27 blank | 51 comment | 45 complexity | f446b44e0d86515ca4a8ae30a3ac9755 MD5 | raw file
  1. <?php
  2. /* SmartOptimizer v1.8
  3. * SmartOptimizer enhances your website performance using techniques
  4. * such as compression, concatenation, minifying, caching, and embedding on demand.
  5. *
  6. * Copyright (c) 2006-2010 Ali Farhadi (http://farhadi.ir/)
  7. * Released under the terms of the GNU Public License.
  8. * See the GPL for details (http://www.gnu.org/licenses/gpl.html).
  9. *
  10. * Author: Ali Farhadi (a.farhadi@gmail.com)
  11. * Website: http://farhadi.ir/
  12. */
  13. //Default settings
  14. $settings = array(
  15. 'baseDir' => '../',
  16. 'charSet' => 'utf-8',
  17. 'debug' => true,
  18. 'gzip' => true,
  19. 'compressionLevel' => 9,
  20. 'gzipExceptions' => array('gif','jpeg','jpg','png','swf','ico'),
  21. 'minify' => true,
  22. 'concatenate' => true,
  23. 'separator' => ',',
  24. 'embed' => true,
  25. 'embedMaxSize' => 5120,
  26. 'embedExceptions' => array('htc'),
  27. 'serverCache' => true,
  28. 'serverCacheCheck' => false,
  29. 'cacheDir' => 'cache/',
  30. 'cachePrefix' => 'so_',
  31. 'clientCache' => true,
  32. 'clientCacheCheck' => false,
  33. );
  34. //mime types
  35. $mimeTypes = array(
  36. "js" => "text/javascript",
  37. "css" => "text/css",
  38. "htm" => "text/html",
  39. "html" => "text/html",
  40. "xml" => "text/xml",
  41. "txt" => "text/plain",
  42. "jpg" => "image/jpeg",
  43. "jpeg" => "image/jpeg",
  44. "png" => "image/png",
  45. "gif" => "image/gif",
  46. "swf" => "application/x-shockwave-flash",
  47. "ico" => "image/x-icon",
  48. );
  49. function headerExit($status) {
  50. header("HTTP/1.0 $status");
  51. exit();
  52. }
  53. function headerNoCache() {
  54. // already expired
  55. header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
  56. // always modified
  57. header("Last-Modified: " . gmdatestr());
  58. // HTTP/1.1
  59. header("Cache-Control: no-store, no-cache, must-revalidate");
  60. header("Cache-Control: post-check=0, pre-check=0", false);
  61. header("Cache-Control: max-age=0", false);
  62. // HTTP/1.0
  63. header("Pragma: no-cache");
  64. //generate a unique Etag each time
  65. header('Etag: '.microtime());
  66. }
  67. function headerNeverExpire(){
  68. header("Expires: " . gmdatestr(time() + 315360000));
  69. header("Cache-Control: max-age=315360000");
  70. }
  71. function debugExit($msg){
  72. global $settings;
  73. if (!$settings['debug']) {
  74. headerExit('404 Not Found');
  75. }
  76. headerNoCache();
  77. header('Content-Type: text/html; charset='.$settings['charSet']);
  78. header("Content-Encoding: none");
  79. echo "//<script>\n";
  80. echo "alert('SmartOptimizer Error: ".str_replace("\n", "\\n", addslashes($msg))."');\n";
  81. echo "//</script>\n";
  82. exit();
  83. }
  84. function gmdatestr($time = null) {
  85. if (is_null($time)) $time = time();
  86. return gmdate("D, d M Y H:i:s", $time) . " GMT";
  87. }
  88. function filesmtime() {
  89. global $files, $fileType;
  90. static $filesmtime;
  91. if ($filesmtime) return $filesmtime;
  92. $filesmtime = max(@filemtime("minifiers/$fileType.php"), filemtime('index.php'), filemtime('config.php'));
  93. foreach ($files as $file) {
  94. if (!file_exists($file)) debugExit("File not found ($file).");
  95. $filesmtime = max(filemtime($file), $filesmtime);
  96. }
  97. return $filesmtime;
  98. }
  99. @include('config.php');
  100. list($query) = explode('?', urldecode($_SERVER['QUERY_STRING']));
  101. // ---------- ORIGIN WAY -------------------------------------------------------
  102. /*
  103. if (preg_match('/^\/?(.+\/)?(.+)$/', $query, $matchResult)) {
  104. $fileNames = $matchResult[2];
  105. $fileDir = $settings['baseDir'].$matchResult[1];
  106. } else debugExit("Invalid file name ($query)");
  107. if (strpos(realpath($fileDir), realpath($settings['baseDir'])) !== 0) debugExit("File is out of base directory.");
  108. if ($settings['concatenate']) {
  109. $files = explode($settings['separator'], $fileNames);
  110. $settings['concatenate'] = count($files) > 1;
  111. } else $files = array($fileNames);
  112. foreach ($files as $key => $file) {
  113. if (preg_match('/^[^\x00]+\.([a-z0-9]+)$/i', $file, $matchResult)) {
  114. $fileTypes[] = strtolower($matchResult[1]);
  115. } else debugExit("Unsupported file ($file)");
  116. $files[$key] = $fileDir.$file;
  117. }
  118. if ($settings['concatenate']) {
  119. if (count(array_unique($fileTypes)) > 1) debugExit("Files must be of the same type.");
  120. }
  121. $fileType = $fileTypes[0];
  122. */
  123. // ---------- MY WAY -----------------------------------------------------------
  124. /**
  125. * @assign $files, $fileType
  126. */
  127. $files = explode($settings['separator'], $query);
  128. $fileType = strtolower(substr(strrchr($files[0], '.'), 1));
  129. foreach ($files as &$f)
  130. $f = $settings['baseDir'].$f;
  131. // -----------------------------------------------------------------------------
  132. if (!isset($mimeTypes[$fileType])) debugExit("Unsupported file type ($fileType)");
  133. header("Content-Type: {$mimeTypes[$fileType]}; charset=".$settings['charSet']);
  134. $settings['gzip'] =
  135. ($settings['gzip'] &&
  136. !in_array($fileType, $settings['gzipExceptions']) &&
  137. in_array('gzip', array_map('trim', explode(',' , @$_SERVER['HTTP_ACCEPT_ENCODING']))) &&
  138. function_exists('gzencode'));
  139. if ($settings['gzip']) header("Content-Encoding: gzip");
  140. $settings['minify'] = $settings['minify'] && file_exists('minifiers/'.$fileType.'.php');
  141. $settings['embed'] = $settings['embed'] && $fileType == 'css' && (!preg_match('/msie/i', $_SERVER['HTTP_USER_AGENT']) || preg_match('/msie 8|opera/i', $_SERVER['HTTP_USER_AGENT']));
  142. $settings['serverCache'] = $settings['serverCache'] && ($settings['minify'] || $settings['gzip'] || $settings['concatenate'] || $settings['embed']);
  143. if ($settings['serverCache']) {
  144. $cachedFile = $settings['cacheDir'].$settings['cachePrefix'].md5($query.($settings['embed']?'1':'0')).'.'.$fileType.($settings['gzip'] ? '.gz' : '');
  145. }
  146. $generateContent = ((!$settings['serverCache'] && (!$settings['clientCache'] || !$settings['clientCacheCheck'] || !isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) || $_SERVER['HTTP_IF_MODIFIED_SINCE'] != gmdatestr(filesmtime()))) ||
  147. ($settings['serverCache'] && (!file_exists($cachedFile) || ($settings['serverCacheCheck'] && filesmtime() > filemtime($cachedFile)))));
  148. if ($settings['clientCache'] && $settings['clientCacheCheck']) {
  149. if ($settings['serverCache'] && !$generateContent) $mtime = filemtime($cachedFile);
  150. elseif ($settings['serverCache']) $mtime = time();
  151. else $mtime = filesmtime();
  152. $mtimestr = gmdatestr($mtime);
  153. }
  154. if (!$settings['clientCache'] || !$settings['clientCacheCheck'] || !isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) || $_SERVER['HTTP_IF_MODIFIED_SINCE'] != $mtimestr) {
  155. if ($settings['clientCache'] && $settings['clientCacheCheck']) {
  156. header("Last-Modified: " . $mtimestr);
  157. header("Cache-Control: must-revalidate");
  158. } elseif ($settings['clientCache']) {
  159. headerNeverExpire();
  160. } else headerNoCache();
  161. if ($generateContent) {
  162. if ($settings['minify']) include('minifiers/'.$fileType.'.php');
  163. $content = array();
  164. foreach ($files as $file) (($content[] = @file_get_contents($file)) !== false) || debugExit("File not found ($file).");
  165. $content = implode("\n", $content);
  166. if ($settings['minify']) $content = call_user_func('minify_' . $fileType, $content);
  167. if ($settings['gzip']) $content = gzencode($content, $settings['compressionLevel']);
  168. if ($settings['serverCache']) {
  169. $handle = @fopen($cachedFile, 'w') or debugExit("Could not create cache file($cachedFile).");
  170. fwrite($handle, $content);
  171. fclose($handle);
  172. }
  173. header('Content-Length: ' . strlen($content));
  174. echo $content;
  175. } else {
  176. header('Content-Length: ' . filesize($cachedFile));
  177. readfile($cachedFile);
  178. }
  179. } else headerExit('304 Not Modified');
  180. ?>