SDF-group

USCACHE - отдаем статичные страницы

Краткое изложение:

Концепция USCACHE:
Отдача наиболее посещаемых страниц сайта полностью в статичном виде.

  • В чем отличие от стандартного кеша joomla:
    Стандартный кеш джумла ускоряет загрузку страниц, но фреймворк отрабытывает полностью, также кеш отдается фрагментарно. USCACHE останавливает фреймворк в случае обнаружения возможности загрузить кеш и загружает полностью статичную страницу, сохраненную заранее.
  • А если на сайте динамичный контент (корзина):
    Концепция тестировалось на свзяке joomla 2.5 + virtuemart. Решение заключается в том что первая страница сайта для посетителя всегда грузится динамически, для получения сессии и окружения. Последущие статично. В случае корзины virtuemart проверяется ее активность и если в корзине что-то лежит, она используется, то страницы загружается динамично.
  • А если стоит LMplugin?
    Система интегрирована с LMplugin, заголовок Last Modified отдается в любом случае.
  • А если кеш битый?
    Перед загрузкой статики она проверяется на целостность и корректность.
  • Как сохраняется кеш?
    На данный момент кеш сохраняется отдельной программой на C++, которую можно запустить удаленно из браузера и спланировать задания cron. Возможна реализация на других языках программирования.
  • Как системой управлять?
    Включение и выключение uscache интегрировано в плагин LMplugin.
  • А если нужно посмотреть как выглядит динамичная страница?
    Для этого есть флаг ?nocache, который отключает загрузку статики конкретной страницы в данный момент.
  • А зачем все это нужно и так все хорошо?
    Я за вас рад!

Полное изложение

Идея USCACHE родилась случайно. USCACHE не компонент и не плагин JOOMLA. А интересный подход к кешированию страниц сайта и отдаче их в полностью статичном виде.

Сама концпеция родилась при размышлении о ускорении загрузки страниц одного из проектов, интернет магазина на joomla 2.5 с использованием virtuemart 2. Скажу сразу на выделенном хостинге сайт летал и так, были применены все мыслимые методы:

      • кеширование байт-кода php
      • стандартное кеширование joomla
      • отдельное кеширование css и js
      • включен gzip

Идея возникла исходя из постулата - 20 процентов клиентов приносят 80% прибыли. На языке web это означало - 20% страниц сайта посещают 80% пользователей.

На практике, при анализе статистики посещаемости данного проекта выяснилось, что при ресурсе проекта более чем в 700 страниц, около 10 являются наиболее посещаемыми. Это оказались главная страницы и наиболее популярные каталоги и товары. Возникла идея эти 10 страниц отдавать полностью в статичном виде.

Технически концепция заключалась в следующем:

      1. В корневой директории сайта создается папка, куда кладутся статичные html файлы нужных страниц.
      2. При инициализации джумла проверяет наличие кеша и в случае успеха вместо дальнейшей работы фреймворка загружает статику из каталога.
        На деле я столкнулся со сложностями:
      1. Проект был интернет-магазином и необходимо было обеспечить нормальную работу virtuemart и корзины.
      2. Проект активно продвигается в интернете, необходимо чтобы страница отдавала корректные заголовки, необходимые поисковым системам.
        Итоговая реализация выглядит так:
      1. При посещении первой страницы пользователем она загружается динамически, создается сессия и все необходимое окружение для работы компонентов.
      2. При посещениие других страниц они загружаются статично, если кеш существует.
      3. Даже при отдаче статичных страниц отрабатывает плагин LMplugin и отдает необходимые заголовки.

На практике наблюдалось ускорение загрузки страницы более чем в 2 раза и использовнием кеша.

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

Итак, программа при запуске читала свой конфигурациионный файл, где перечислялись страницы проекты, которые было необходимо закешировать. После этого указанные страницы запрашивались и складывались в папку с кешем. Программа работает по крону и доступна из бразуера для ручного обновления кеша.

      После этого было решено добавить защиту от сбоев при загрузке кеша джумлой, а именно:
    • перед загрузкой статичной страницы проверяется целостна ли она (загружена ли полностью)
    • также проверяется корректна ли страница (проверка на ошибку сервера)
      Последним этапом стало подключение управления системой, а именно:
    • для удобства разработки загрузку динамичной страницы вместо кеша можно инициализировать добавлением к url параметра ?nocache
    • Плагин LMplugin был доработан для включения и выключения USCACHE

Как это организовать?

У меня кеш кладет программа на С++, но можно и вручную. В корне сайта создается папка uscache, туда кладем кеш, повторяющий дерево сайта. То есть, если адрес страницы test.ru/news/one.html, то структура папок будет соответствующая /usecache/news/one.html, где one.html файл, содержащий статичную страницу.

В корневойм файле index.php, вставляем код USCACHE, между JDEBUG ? $_PROFILER->mark('afterRoute') : null; и $app->dispatch();

//START USCACHE
$plugin = JPluginHelper::getPlugin('system', 'lmplugin');
$param_lm = json_decode($plugin->params);

if(!isset($_GET['nocache']) && $param_lm->uscache_lm == "1"){
foreach($_COOKIE as $kuk => $key){
	if(strlen($key) > 10) $find_kuk = $key;
};
$vm_ch = 0;
if(isset($_SESSION["__vm"]["vmcart"])){
	$vm_ch = $_SESSION["__vm"]["vmcart"];
	$vm_ch = preg_split('/"products";a:/', $vm_ch);
	$vm_ch = preg_split('/:{}s:8:"vendorId"/', $vm_ch[1]);
	$vm_ch = (int)$vm_ch[0];
}
if(isset($find_kuk) && $vm_ch == 0){
	if($_SERVER['REQUEST_URI'] == "/"){
		$put = file_get_contents("uscache/index.html");
		if(substr_count($put, '</html>') > 0 && strlen($put) > 5000){
				echo $put;
				exit;
		}
	}else{
		if (file_exists("uscache".$_SERVER['REQUEST_URI'])) {
			
			$put = file_get_contents("uscache".$_SERVER['REQUEST_URI']);
			if(substr_count($put, '</html>') > 0 && strlen($put) > 5000){
				echo $put;
				exit;
}
}
//END USCACHE


Этот пример отрабатывает решение с корзиной virtuemart. В этом плане решения могут быть разными для разных сайтов.

Включение управления в LMplugin

Для включения управлнения USCACHE в LMplugin необходимо добавить секцию в файле lmplugin.xml в папке плагина.

В секцию fieldset name="basic" добавляем:

<field	name="uscache_lm" type="radio" default="0" description="Управление системой USCACHE" label = "Включить">
					<option
						value="0">JNo</option>
					<option
						value="1">JYes</option>
				</field>

Должно получится:

<fieldset name="basic">
				<field	name="cache_lm" type="radio" default="0" description="Отключить кеш" label="Отключить кеш">
					<option
						value="0">JNo</option>
					<option
						value="1">JYes</option>
				</field>
				<field	name="uscache_lm" type="radio" default="0" description="Управление системой USCACHE" label="Включить">
					<option
						value="0">JNo</option>
					<option
						value="1">JYes</option>
				</field>
		</fieldset>

Теперь можно включать и выключить USCACHE через LMplugin

Комментарии   

 
0 #2 admin 16.02.2015 20:35
Вполне, так как структура состоит из блока кода, встраиваемого в joomla, и программы, которая может быть реализована на любом языке, доступном на хостинге.
Цитировать
 
 
0 #1 Константин 17.01.2015 10:58
Полезное решение!
Вопрос: возможно ли реализовать данный способ кэширования на shared-хостинге ?
Цитировать
 

Добавить комментарий


Защитный код
Обновить