Ответить Новая тема Новый опрос 
Всего: 9 1 2 3 4 5 > »
 Оптимизация кэширования
ors
Профессионал
Сообщений: 1885
Регистрация: 09-11-2009


23-05-2010 18:29
Сейчас провел тестирование престы на локалхосте при помощи утилиты ab.

Версия 1.3.0.1, установка с демонстрационными данными, проверка главной страницы.

Cреднее время 4016

В smarty.config.inc.php ставим:
Код:
$smarty->force_compile    = false;

Cреднее время: 1041

Добавляем в модуль blockmanufacturer кэширование:
Код:
function hookLeftColumn($params)
    {
        global $smarty, $link;
//Включаем кэширование
    $smarty->caching = true;
//Проверяем кэширован ли уже блок
    if (!$smarty->is_cached(dirname(__FILE__).'/'.'blockmanufacturer.tpl')) {
//Если нет - получаем данные
            $smarty->assign(array(
                'manufacturers' => Manufacturer::getManufacturers(),
                'link' => $link,
            ));
    }
//Обрабатываем шаблон
        $page= $this->display(__FILE__, 'blockmanufacturer.tpl');
//Выключаем кэширование
        $smarty->caching = false;
//Возвращаем результат
        return $page;
    }

Cреднее время: 1011

В первом случае параметр force_compile заставляет принудительно перекомпилировать шаблоны при каждом обращении, видимо, это сделано для отладки, но для рабочих магазинов этот параметр лучше изменить.
Использование кэширования для одного блока в третьем случае не дает значительного прироста скорости, однако уменьшает на 1 количество выполняемых запросов. Кроме того, большинство блоков является статическими (например blockinfos, blockadvertising), так что при правильном применении кэширования можно увеличить скорость работы магазина.
 
Репутация: 3 | Поставил: Алекс
Вне форума
ПМ Отправить эл.сообщение 
Щелкните, и это сообщение будет добавлено в ваш ответ как цитата Цитировать этот ответ
bigman2009
Новичок
Сообщений: 15
Регистрация: 27-08-2009


30-05-2010 03:47
Не раз возникала мысль о том, почему в Престе не используется кэш смарти.
Наверное, это будет в следующих релизах :)
То, что вы представили здесь снизит кол-во запросов к БД существенно. При условии, что кэширование будет применено и к другим статическим блокам как то: blockcategories, homefeatured и др. Конечно, необходимо при добавлении , скажем, новой категории удалять файлы из tools\smarty\cache .
Но это решение только части задачи кэширования смарти в Престе. Вот еще бы разобраться , как создавать кэш для таких страниц как category.php, product.php, cms.php и других подобных страниц.
Спасибо за полезный пост
 
Вне форума
ПМ Отправить эл.сообщение 
Щелкните, и это сообщение будет добавлено в ваш ответ как цитата Цитировать этот ответ
ors
Профессионал
Сообщений: 1885
Регистрация: 09-11-2009


30-05-2010 12:13
Тестировал со включенным кэшированием во всех статических блоках в левой и правой колонках - удалось снизить время загрузки на 30-40%. Еще добавил кэширование к sitemap.php (у меня больше 400 категорий, поэтому поисковики из-за долгой загрузки вообще отказывались страницу загружать)

В официальной престе, думаю, кэширование еще не скоро сделают. Это связано с поддержкой мультиязычности.

Для страниц кэш сделать тоже легко, но нужно ли? Во-первых это вмешательство в движек, а во-вторых для каждой категории и для каждого товара будет создаваться своя страница в кэше. У меня 7000 товаров, так что лучше оставлю как есть.

Вот пример для кэширования категорий (используется множественное кэширование, в качестве ид кэша- идентификатор категории):
Код:
/*fix*/
$smarty->caching      = true;
if (!$smarty->is_cached(_PS_THEME_DIR_.'category.tpl', Tools::getValue('id_category'))) {
/*fix*/
$errors = array();
if (!isset($_GET['id_category']) OR !Validate::isUnsignedId($_GET['id_category']))
    $errors[] = Tools::displayError('category ID is missing');
else
{
...
if (isset($subCategories))
    $smarty->assign(array(
        'subcategories_nb_total' => sizeof($subCategories),
        'subcategories_nb_half' => ceil(sizeof($subCategories) / 2)));

//$smarty->display(_PS_THEME_DIR_.'category.tpl');
/*fix*/
}
$smarty->display(_PS_THEME_DIR_.'category.tpl',Tools::getValue('id_category'));
$smarty->caching      = false;
/*fix*/

 
Вне форума
ПМ Отправить эл.сообщение 
Щелкните, и это сообщение будет добавлено в ваш ответ как цитата Цитировать этот ответ
Artyom4D


Профессионал
Сообщений: 304
Откуда: Киев
Регистрация: 01-11-2009


06-06-2010 23:48
Хотел спросить тебя насчет кеширования. Есть параметр
$smarty->caching = false; как только я меняю его на true сайт постоянно перезагружается. В чем может быть проблема? Версия Prestadev 0.6
 



Разработка, поддержка, оптимизация
-------------------------------------------------------
deadline-solutions.com; DS Super Slider 1.2; DS Comments
Вне форума
ПМ Отправить эл.сообщение 
Щелкните, и это сообщение будет добавлено в ваш ответ как цитата Цитировать этот ответ
Ирина Ка
Cпециалист
Сообщений: 199
Регистрация: 21-11-2009


07-06-2010 05:56
ors, пример кэширования, который ты привёл, в каких файлах нужно прописывать?
 
Вне форума
ПМ 
Щелкните, и это сообщение будет добавлено в ваш ответ как цитата Цитировать этот ответ
ors
Профессионал
Сообщений: 1885
Регистрация: 09-11-2009


07-06-2010 12:02
Artyom4D
Смотря где этот параметр находится. Если в smarty.config.inc.php, то он всегда должен быть false. На уровне движка магазин не поддерживает кэширование, так что его включение может привести к непредсказуемым последствиям.

Ирина Ка
первый - в статических модулях: блок производителей blockmanufacturer.php, рекламный модуль, блок информации, дополнительные ссылки в футере, editorial, homefeatured и других блоках, которые выглядят одинаково на всех страницах и для всех посетителей.
второй - при множественном кэшировании: category.php, cms.php, product.php (если продуктов не много)
 
Вне форума
ПМ Отправить эл.сообщение 
Щелкните, и это сообщение будет добавлено в ваш ответ как цитата Цитировать этот ответ
Ирина Ка
Cпециалист
Сообщений: 199
Регистрация: 21-11-2009


08-06-2010 00:58
Спасибо большое, ors! :wink2:
 
Вне форума
ПМ 
Щелкните, и это сообщение будет добавлено в ваш ответ как цитата Цитировать этот ответ
ors
Профессионал
Сообщений: 1885
Регистрация: 09-11-2009


08-06-2010 16:36
Раз тема про кэширование, то вот еще небольшая доработка:
Включаем кэширование на стороне клиента для css, js, ico, png, gif (jpg не включил так как картинки могут обновляться, кому нужно - сам добавит). В файл .htaccess добавляем следующие строчки:
Код:
<FilesMatch \.(css|js|ico|png|gif)$>
<IfModule mod_headers.c>
    Header append Cache-Control private
  </IfModule>
<IfModule mod_expires.c>
    ExpiresActive On
    ExpiresDefault "access plus 10 years"
</IfModule>
</FilesMatch>


Включение сжатия css и js без увеличения нагрузки на сервер:
1. Пакуем файлы (с помощью 7-zip или gzip) и кладем на место обычных (расширение у файлов должно остаться прежним, .css или .js). Например, вы берете файл anyname.css, пакуете его 7-zip, у вас получается файл anyname.css.gz, переименовываем его обратно в anyname.css и заливаем на сервер
2. Рядом с пожатыми файлами кладутся файлы с расширением nogzip.css или nogzip.js, которые содержат неархивированные копии. Например, после заливки сжатого файла anyname.css, вы создаете на сервере еще один файл anyname.nogzip.css, который является копией несжатого файла. Для gzip это копирование уже производится чуть выше второй строкой в листинге
3. Добавляем в .htaccess
Код:
<IfModule mod_rewrite.c>
    RewriteEngine On
#перенаправляем Konqueror и «старые браузеры»
    RewriteCond %{HTTP:Accept-encoding} !gzip [OR]
    RewriteCond %{HTTP_USER_AGENT} Konqueror
    RewriteRule ^(.*)\.(css|js)$ $1.nogzip.$2 [QSA,L]
</IfModule>                

<IfModule mod_headers.c>
    Header append Vary User-Agent
#выставляем для всех css/js файлов Content-Encoding
    <FilesMatch .*\.(js|css)$>
    Header set Content-Encoding: gzip
    Header set Cache-control: private
    </FilesMatch>
#сбрасываем Content-Encoding в том случае, если отдаем не архив
    <FilesMatch .*\.nogzip\.(js|css)$>
    Header unset Content-Encoding
    </FilesMatch>
</IfModule>


Загружаем jquery с google. У многих пользователей он уже есть в кэше, так что снизим размер загрузки еще на 30кб.
В header.tpl заменяем
Код:
<script type="text/javascript" src="{$content_dir}js/jquery/jquery-1.2.6.pack.js"></script>
на
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js" type="text/javascript"></script>
 
Вне форума
ПМ Отправить эл.сообщение 
Щелкните, и это сообщение будет добавлено в ваш ответ как цитата Цитировать этот ответ
ors
Профессионал
Сообщений: 1885
Регистрация: 09-11-2009


09-06-2010 15:58
При включенном ЧПУ адрес картинки имеет вид /ид_картинки/url_rewrite, даже в том случае, когда картинка отсутствует. Это приводит к тому, что картинка по умолчанию загружается для каждого продукта заново. Чтобы этого не происходило в classes\Link.php заменяем функцию getImageLink.
Код:
public function getImageLink($name, $ids, $type = null)
    {
        //fix
            if ($ids==0) $name='default';
        //fix
        return ($this->allow == 1) ? (__PS_BASE_URI__.$ids.($type ? '-'.$type : '').'/'.$name.'.jpg') : (_THEME_PROD_DIR_.$ids.($type ? '-'.$type : '').'.jpg');
    }

И для категорий
Код:
public function getCatImageLink($name, $id_category, $type = null)
    {
        //fix
            if ($id_category==0) $name='default';
        //fix
        return ($this->allow == 1) ? (__PS_BASE_URI__.$id_category.($type ? '-'.$type : '').'/'.$name.'.jpg') : (_THEME_CAT_DIR_.$id_category.($type ? '-'.$type : '').'.jpg');
    }



Сообщение отредактировано ors 09-06-2010 17:00 ...
 
Вне форума
ПМ Отправить эл.сообщение 
Щелкните, и это сообщение будет добавлено в ваш ответ как цитата Цитировать этот ответ
xenol


Новичок
Сообщений: 61
Регистрация: 11-02-2010


09-06-2010 22:26
Очень интересные и полезные приемы кэширования! Как говорится, век живи, век учись.
Попробовал сделать сжатие gzip как написано - все вроде сделал правильно, но браузеры ругаются на сжатые файлы..... Иллегал чарикте, говорят, и все тут.
Пробовал на своем тестовом сервачке на денвере. Никто не знает как подправить ситуацию?
 
Вне форума
ПМ Отправить эл.сообщение 
Щелкните, и это сообщение будет добавлено в ваш ответ как цитата Цитировать этот ответ
Ответить Новая тема Новый опрос 
Всего: 9 1 2 3 4 5 > »