HSDN Mirroring Cacher

Dmitry Shin fce8e70bde Add pattern escape 4 years ago
README.md da781c2d6e Обновить 'README.md' 4 years ago
mcacher.class.php fce8e70bde Add pattern escape 4 years ago

README.md

HSDN Mirroring Cacher

ОПИСАНИЕ

Данный класс позволяет создать зеркало любого удаленного ресурса на локальном сервере. Созданное зеркало по сути является прокси сервером, который будет непосредственно взаимодействовать с удаленным хостом. Благодаря системе встроенного кэширования страниц и картинок, нет нужды многократно загружать одну и ту же страницу с сервера.

ВОЗМОЖНОСТИ

  • POST/GET и другие HTTP-запросы
  • Кэширование страниц и картинок
  • Возможность загрузки файлов
  • Возможность передачи заголовков к удаленному хосту
  • Поддержка Cookies и Сессий
  • Возможность замены содержимого страниц ресурса
  • Возможность назначать исключения из кэширования
  • Возможность работы через HTTP-прокси
  • Возможность передачи файлов на удаленный сервер

СИСТЕМНЫЕ ТРЕБОВАНИЯ

  • PHP 5.2.0 или выше с поддержкой Сокетов
  • Apache 1.3.0 или выше с поддержкой mod_rewrite

ЛИЦЕНЗИЯ

Данный скрипт распространяется по Универсальной общедоступной лицензии GNU General Public License (GNU/GPL).

Авторы не несут ответственность за любой ущерб, причиненный любой стороне в результате использования этого скрипта.

УСТАНОВКА

  1. Скопируйте этот файл в корневой каталог на вашем хосте.
  2. Создайте директорию "cache" и установите на нее права "0777" (подробнее читайте описание команды "chmod").
  3. Создайте файл с названием "cacher.php" и поместите в него скрипт вызова данного класса (см. ПРИМЕРЫ ИСПОЛЬЗОВАНИЯ).
  4. Настройте необходимые переменные, указав адрес сайта, путь к директории "cache" и т.д. (см. ПРИМЕРЫ ИСПОЛЬЗОВАНИЯ).
  5. Создайте и разместите в корневом каталоге файл ".htaccess" со следующим содержанием:

    DirectoryIndex cacher.php
    ErrorDocument 404 /cacher.php
    Options FollowSymLinks
    RewriteEngine on
    RewriteBase /
    RewriteRule ^(.*)$ cacher.php
    
  6. Откройте в браузере ваш хост для просмотра результата работы данного класса.

СПРАВКА ПО ПЕРЕМЕННЫМ

Настройки:
- cache_dir		-- Директория хранения файлов кэша
- cache_time		-- Период хранения кэша в часах (0 -- не кэшировать)
- custom_cache		-- Выборочное кэширование
- forbidden		-- Ограничение доступа к определенным ресурсам
- post_no_cache		-- Не кэшировать POST-запросы
- ignore_sid		-- Игнорировать SESSION ID в путях (URI)
- forwarded		-- Отправлять заголовок X-Forwarded-For
- replace_ref		-- Заменить хост в отправляемых заголовках HTTP_REFERER
Соединение:
- connect		-- Адрес подключения
- proxy_connect		-- Адрес подключения через HTTP-прокси
- proxy_user		-- Пользователь прокси-сервера
- proxy_pass		-- Пароль прокси-сервера
- path			-- Рабочий путь класса
Обрабока:
- head_replace		-- Автозамена фрагментов текста в заголовках
- head_cut		-- Автоудаление фрагментов текста из теле заголовков
- body_replace		-- Автозамена фрагментов текста в теле страницы
- body_cut		-- Автоудаление фрагментов текста из теле страницы

ПРИМЕРЫ ИСПОЛЬЗОВАНИЯ

Для кэширования одного сайта:
<?php
include 'mcacher.class.php'; // Подключение класса

$mcp = new Cacher; // Определение класса
$mcp->cache_dir = 'cache'; // Директория хранения файлов кэша
$mcp->cache_time = 24; // Период хранения кэша в часах (0 -- не кэшировать)

// Пути, для которых следует применить индивидуальный период хранения кэша
$mcp->custom_cache = array
(
	"^/news" => 0, // Не кэшировать страницу /news
	".dhtml$" => 4  // Обновлять кэш для файлов .dhtml раз в 4 часа
);

// Ограничение доступа к различным ресурсам, страницам или файлам
$mcp->forbidden = array
(
	"^/badpage.php", // Закрыть доступ к странице /badpage.php
	".mp3$" // Закрыть доступ ко всем файлам .mp3
);

$mcp->connect = 'http://www.hsdn.org'; // Адрес подключения

// Автозамена реального имени сайта на имя сайта зеркала в заголовках HTTP
$mcp->head_replace = array
(
	'www.hsdn.org' => $_SERVER['SERVER_NAME'] // Для заголовков, пр. Location
);

// Автозамена реального имени сайта на имя сайта зеркала в теле страницы, а также в ссылках на страницах
$mcp->body_replace = array
(
	'http://www.hsdn.org' => '' // Заменяем ссылки вида:
								// href="http://www.hsdn.org/link" на href="/link"
);

$mcp->run_cache(); // Запуск класса
?>
Для кэширования нескольких сайтов:
<?php
include 'mcacher.class.php'; // Подключение класса

$mcp = new Cacher; // Определение класса

$path = $mcp->uri_array(); // Получение аргументов URI

// Выбор сайта по первому аргументу URI
switch($path[1])
{
	// Первый сайт (доступен как: http://my-cache.ru/www.hsdn.org/)
	case 'www.hsdn.org':
		$mcp->cache_dir = 'cache/www.hsdn.org'; // Директория хранения файлов кэша
		$mcp->cache_time = 24; // Период хранения кэша в часах (0 -- не кэшировать)

		$mcp->connect = 'http://www.hsdn.org'; // Адрес подключения
		$mcp->path = '/www.hsdn.org'; // Рабочий путь класса

		// Возможно, придется заменить некоторые ссылки
		$mcp->body_replace = array
		(
			'="/' => '="'.$mcp->path.'/', // Заменяем ссылки вида:
										  // href="/link" на href="/www.hsdn.org/link"
		);

		// ... ниже можно определить остальные переменные, как в первом примере
		break;

	// Второй сайт (доступен как: http://my-cache.ru/www.ya.ru/)
	case 'www.ya.ru':
		$mcp->cache_dir = 'cache/www.ya.ru'; // Директория хранения файлов кэша
		$mcp->cache_time = 0; // Период хранения кэша в часах (0 -- не кэшировать)

		$mcp->connect = 'http://www.ya.ru'; // Адрес подключения
		$mcp->path = '/www.ya.ru'; // Рабочий путь класса

		// Возможно, придется заменить некоторые ссылки
		$mcp->body_replace = array
		(
			'="/' => '="'.$mcp->path.'/', // Заменяем ссылки вида:
										  // href="/link" на href="/www.ya.ru/link"
		);

		// ... ниже можно определить остальные переменные, как в первом примере
		break;

	// Сайт по-умолчанию (доступен как: http://my-cache.ru/)
	default:
		$mcp->cache_dir = 'cache'; // Директория хранения файлов кэша
		$mcp->cache_time = 0; // Период хранения кэша в часах (0 -- не кэшировать)

		$mcp->connect = 'http://www.mail.ru'; // Адрес подключения

		// ... ниже можно определить остальные переменные, как в первом примере
		break;
}

$mcp->run_cache(); // Запуск класса
?>