AVE.CMS v3.28
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

202 lines
7.0 KiB

7 years ago
<?php
// включить/выключить кэширование
$cache = true;
// уровень вложенности текущей директории относительно корня
// для определения правильного пути к папке кэша
// (например, если combine.php лежит в корне, пишем 0).
// можно передать через адр. строку: level=(int)
$level = 0;
// имя папки кэша относительно корня
$cachedir = '/cache/combine';
###############################################################
// определяем путь до папки кэша
if ($cache)
{
$level = ($_GET['level']) ? $_GET['level'] : $level;
$cachedir = trim($cachedir,'/');
for ($i=0; $i<$level; $i++)
{
$cachedir = '../' . $cachedir;
}
$cachedir = str_replace("\\", "/", dirname(__FILE__)) . '/' . $cachedir;
if(!is_dir($cachedir))
{
header ("HTTP/1.0 503 Not Implemented");
exit("/*
combine.php: Error!
Неверно указан путь к папке кэша. Проверьте уровень вложенности.
*/");
}
}
// Определяем тип файлов, полный путь к файлам и получаем список имен файлов
if (!empty($_GET['css']))
{
$type = 'css';
$hash = md5($_GET['css']);
$elements = explode(',', $_GET['css']);
}
elseif (!empty($_GET['js']))
{
$type = 'javascript';
$hash = md5($_GET['js']);
$elements = explode(',', $_GET['js']);
}
else
{
@header ("HTTP/1.0 503 Not Implemented");
exit;
}
$base = realpath(dirname(__FILE__));
// Determine last modification date of the files
$lastmodified = 0;
while (list(,$element) = each($elements)) {
$path = realpath($base . '/' . $element);
if (($type == 'javascript' && substr($path, -3) != '.js') ||
($type == 'css' && substr($path, -4) != '.css')) {
@header ("HTTP/1.0 403 Forbidden");
exit;
}
if (substr($path, 0, strlen($base)) != $base || !file_exists($path)) {
@header ("HTTP/1.0 404 Not Found");
exit;
}
$lastmodified = max($lastmodified, filemtime($path));
}
// Send Etag hash
@$hash = $lastmodified . '-' . md5($_GET['files']);
@header ("Etag: \"" . $hash . "\"");
if (isset($_SERVER['HTTP_IF_NONE_MATCH']) &&
stripslashes($_SERVER['HTTP_IF_NONE_MATCH']) == '"' . $hash . '"')
{
// Return visit and no modifications, so do not send anything
@header ("HTTP/1.0 304 Not Modified");
@header ('Content-Length: 0');
}
else
{
// First time visit or files were modified
if ($cache)
{
// Determine supported compression method
$gzip = strstr($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip');
$deflate = strstr($_SERVER['HTTP_ACCEPT_ENCODING'], 'deflate');
// Determine used compression method
$encoding = $gzip ? 'gzip' : ($deflate ? 'deflate' : 'none');
// Check for buggy versions of Internet Explorer
if (!strstr($_SERVER['HTTP_USER_AGENT'], 'Opera') &&
preg_match('/^Mozilla\/4\.0 \(compatible; MSIE ([0-9]\.[0-9])/i', $_SERVER['HTTP_USER_AGENT'], $matches)) {
$version = floatval($matches[1]);
if ($version < 6)
$encoding = 'none';
if ($version == 6 && !strstr($_SERVER['HTTP_USER_AGENT'], 'EV1'))
$encoding = 'none';
}
// Try the cache first to see if the combined files were already generated
$cachefile = 'cache-' . $hash . '.' . $type . ($encoding != 'none' ? '.' . $encoding : '');
if (file_exists($cachedir . '/' . $cachefile)) {
if ($fp = fopen($cachedir . '/' . $cachefile, 'rb')) {
if ($encoding != 'none') {
@header ("Content-Encoding: " . $encoding);
}
@header ("Content-Type: text/" . $type);
@header ("Content-Length: " . filesize($cachedir . '/' . $cachefile));
fpassthru($fp);
fclose($fp);
exit;
}
}
}
// Get contents of the files
$contents = '';
reset($elements);
while (list(,$element) = each($elements)) {
$path = realpath($base . '/' . $element);
$contents .= file_get_contents($path);
}
if ($type == 'javascript')
{
for ($i = 1; $i < 10; $i++)
{
$contents = str_replace("\n\n", "\n", $contents); //Удаляем переносы строк
$contents = str_replace("\r\r", "\r", $contents); //Удаляем переносы строк
$contents = str_replace("\r\n\r\n", "\r\n", $contents); //Удаляем переносы строк
}
}
if ($type == 'css')
{
$contents = preg_replace('/\/\*.*\*\//Uis', '', $contents); //Удаляем комментарии
$contents = str_replace("\r", "", $contents); //Удаляем переносы строк
$contents = str_replace("\n", "", $contents); //Удаляем переносы строк
$contents = str_replace(chr(9), "", $contents); //Удаляем табуляцию
$contents = str_replace(" }", "}", $contents); //Удаляем пробелы перед }
$contents = str_replace(" {", "{", $contents); //Удаляем пробелы перед {
$contents = str_replace("{ ", "{", $contents); //Удаляем пробелы после {
$contents = str_replace("} ", "}", $contents); //Удаляем пробелы после }
$contents = str_replace("; ", ";", $contents); //Удаляем пробелы после ;
$contents = str_replace(" ;", ";", $contents); //Удаляем пробелы перед ;
$contents = str_replace(" :", ":", $contents); //Удаляем пробелы перед :
$contents = str_replace(": ", ":", $contents); //Удаляем пробелы после :
$contents = str_replace("+ ", "+", $contents); //Удаляем пробелы после +
$contents = str_replace(" +", "+", $contents); //Удаляем пробелы перед +
$contents = str_replace("= ", "=", $contents); //Удаляем пробелы после =
$contents = str_replace(" =", "=", $contents); //Удаляем пробелы перед =
$contents = str_replace("- ", "-", $contents); //Удаляем пробелы после -
$contents = str_replace("/ ", "/", $contents); //Удаляем пробелы после /
$contents = str_replace(" /", "/", $contents); //Удаляем пробелы перед /
$contents = str_replace(", ", ",", $contents); //Удаляем пробелы после ,
$contents = str_replace(" ,", ",", $contents); //Удаляем пробелы перед ,
$contents = str_replace(" ", " ", $contents); //Удаляем двойной пробел
}
// Send Content-Type
@header ("Content-Type: text/" . $type);
if (isset($encoding) && $encoding != 'none')
{
// Send compressed contents
$contents = gzencode($contents, 3, $gzip ? FORCE_GZIP : FORCE_DEFLATE);
@header ("Content-Encoding: " . $encoding);
@header ('Content-Length: ' . strlen($contents));
echo $contents;
}
else
{
// Send regular contents
@header ('Content-Length: ' . strlen($contents));
echo $contents;
}
// Store cache
if ($cache) {
if ($fp = fopen($cachedir . '/' . $cachefile, 'wb')) {
fwrite($fp, $contents);
fclose($fp);
}
}
}
?>