Перейти к содержанию
Официальный форум поддержки Simpla

Кеширование. Половина решения


Рекомендуемые сообщения

Это - код файла index.php
<?PHP
$time_start = microtime(true);
$cacheurl = md5($_SERVER['REQUEST_URI']);
$rndomis=rand(123456,654321); 
require_once('view/IndexView.php');
$view = new IndexView();
$themecache = $view->settings->theme;
error_reporting(E_NONE);
session_start();
setlocale(LC_TIME, 'ru_RU.UTF-8');
if ((file_exists('cache0/'.$themecache.'/'.$cacheurl)) && (!$_POST[text]) && (!$_POST[name]))
{
    header("Content-type: text/html; charset=UTF-8");
    header("Expires: ".gmdate("D, d M Y H:i:s", time()+($rndomis*3))." GMT"); 
    $cachefile = 'cache0/'.$themecache.'/'.$cacheurl;
    $htmlcode = file_get_contents($cachefile);
    echo $htmlcode;
    fclose($cachefile);
    print "\r\n<!--   ";
    print "cache";
    print "  -->";
}
else
{
    if(($res = $view->fetch()) !== false && $_SERVER['QUERY_STRING']!='module=ProductsView')
    {
        ob_start();
        header("Content-type: text/html; charset=UTF-8");
        header("Expires: ".gmdate("D, d M Y H:i:s", time()+($rndomis*3))." GMT"); 
        print $res;
        $htmlcode = ob_get_contents();
        $cachefile = fopen('cache0/'.$themecache.'/'.$cacheurl, 'w') or die("-");
        fwrite($cachefile,$htmlcode);
        fclose($cachefile);
    }
    else 
    { 
        header("http/1.0 404 not found");
        $_GET['page_url'] = '404';
        $_GET['module'] = 'ErrorView';
        print $view->fetch();   
    }
    }
    if(true){
        print "\r\n<!--   ";
        $time_end = microtime(true);
        $exec_time = $time_end-$time_start;
          if(function_exists('memory_get_peak_usage'))
            print "память: ".round(memory_get_peak_usage()/1024/1024, 2)." Мбайт, ";  
        print "время: ".round($exec_time*1000,0)." мÑ.   ";
        print "-->";
    }

Описание

Если на страницу заходили, она выдаётся из кеша, при этом simpla к MySQL не обращается

Достоинства:

1. Снижает нагрузку на хостинг

2. Уменьшает время генерации (у меня было от 25-30 до 400-500 мсек, стало 5-7 мсек). 

3. Если БД недоступна/легла, сайт продолжит работать.

4. Комментарии работают (страница грузится не из кеша, а динамически)

Недостатки:

1. если кто-то добавил комментарий, он не добавится, т.к. данные не передадутся, надо бы проверку поставить...

2. Корзина также работать не будет, хотя не знаю, какая она у вас, если всё через ajax, то почему бы и да. Просто у меня корзины в шаблоне нет, поэтому не проверял.

3. Сортировка работает (она у меня идёт как параметр url, то есть ?sort=page-max), но при переходе на другую страницу, сортировка становится "по умолчанию".

4. Блок "вы просматривали" таким образом тоже не будет выводиться, если он нужен, придётся подгружать динамически.

5. При изменении цены в админке, описания и т.д., нужно будет обновить кеш.

В целом для моих задач - то, что нужно. Специалисты, окиньте профессиональным взглядом и скажите, что здесь ещё упущено...

Изменено пользователем question
Ссылка на сообщение
Поделиться на другие сайты

А почему не кешировать сами запросы без кеширования страниц?

 

Или если уж кешировать страницу, то через smarty?

Ссылка на сообщение
Поделиться на другие сайты

В целом для моих задач - то, что нужно. Специалисты, окиньте профессиональным взглядом и скажите, что здесь ещё упущено...

 

Если Вы таким способом свои задачи решили, то Вас можно поздравить.

А для обычного магазина это совсем не годится - метод убивает на корню любое типовое взаимодействие посетителя с сайтом. Массу недостатков Вы сами описали, и это наверняка не все...

Ссылка на сообщение
Поделиться на другие сайты

Если Вы таким способом свои задачи решили, то Вас можно поздравить.

А для обычного магазина это совсем не годится - метод убивает на корню любое типовое взаимодействие посетителя с сайтом. Массу недостатков Вы сами описали, и это наверняка не все...

Вроде, решил. И это может быть первым шагом к созданию более серьёзной системы кеширования. Например, есть идея кешировать хедер, футер, меню, а контент - отдельно. Или кешировать по параметрам, например, только определённые категории.

_________

Интернет-витрина (магазин, в котором вместо привычной для многих корзины кнопка "купить" с всплывающим окошком) работает.

Комментарии работают

Скорость загрузки увеличилась

Нагрузка снизилась. Непонятно лишь, на что эти 6-8 мсек тратятся, неужели на ssd чтение файла такое долгое...

_________

Но вот все ли заголовки передаются корректно - вопрос. И вдруг я что-то не учёл, поэтому прошу специалистов глянуть.

И вот ещё. Прошу протестировать на своих магазинах, пусть и демо - это не сложно - и о результатах отписаться.

Ссылка на сообщение
Поделиться на другие сайты

Вроде, решил. И это может быть первым шагом к созданию более серьёзной системы кеширования. Например, есть идея кешировать хедер, футер, меню, а контент - отдельно. Или кешировать по параметрам, например, только определённые категории.

_________

Интернет-витрина (магазин, в котором вместо привычной для многих корзины кнопка "купить" с всплывающим окошком) работает.

Комментарии работают

Скорость загрузки увеличилась

Нагрузка снизилась. Непонятно лишь, на что эти 6-8 мсек тратятся, неужели на ssd чтение файла такое долгое...

_________

Но вот все ли заголовки передаются корректно - вопрос. И вдруг я что-то не учёл, поэтому прошу специалистов глянуть.

И вот ещё. Прошу протестировать на своих магазинах, пусть и демо - это не сложно - и о результатах отписаться.

 

/products не работает

Изменено пользователем DaVinci
Ссылка на сообщение
Поделиться на другие сайты

При работе с корзиной основной код не показывает товары в корзине 

Нужна работа с сессией

if(!empty($_SERVER['HTTP_USER_AGENT'])){
    session_name(md5($_SERVER['HTTP_USER_AGENT']));
}
session_start();

 

Будет вот так

<?PHP
$time_start = microtime(true);

if(!empty($_SERVER['HTTP_USER_AGENT'])){
    session_name(md5($_SERVER['HTTP_USER_AGENT']));
}
session_start();
$cacheurl = md5($_SERVER['REQUEST_URI']);
$rndomis=rand(123456,654321); 
require_once('view/IndexView.php');
$view = new IndexView();
$themecache = $view->settings->theme;
error_reporting(E_NONE);

setlocale(LC_TIME, 'ru_RU.UTF-8');
if ((file_exists('cache0/'.$themecache.'/'.$cacheurl)) && (!$_POST[text]) && (!$_POST[name]))
{
    header("Content-type: text/html; charset=UTF-8");
    header("Expires: ".gmdate("D, d M Y H:i:s", time()+($rndomis*3))." GMT"); 
    $cachefile = 'cache0/'.$themecache.'/'.$cacheurl;
    $htmlcode = file_get_contents($cachefile);
    echo $htmlcode;
    fclose($cachefile);
    print "\r\n<!--   ";
    print "cache";
    print "  -->";
}
else
{
    if(($res = $view->fetch()) !== false && $_SERVER['QUERY_STRING']!='module=ProductsView')
    {
        ob_start();
        header("Content-type: text/html; charset=UTF-8");
        header("Expires: ".gmdate("D, d M Y H:i:s", time()+($rndomis*3))." GMT"); 
        print $res;
        $htmlcode = ob_get_contents();
        $cachefile = fopen('cache0/'.$themecache.'/'.$cacheurl, 'w') or die("-");
        fwrite($cachefile,$htmlcode);
        fclose($cachefile);
    }
    else 
    { 
        header("http/1.0 404 not found");
        $_GET['page_url'] = '404';
        $_GET['module'] = 'ErrorView';
        print $view->fetch();   
    }
    }
    if(true){
        print "\r\n<!--   ";
        $time_end = microtime(true);
        $exec_time = $time_end-$time_start;
          if(function_exists('memory_get_peak_usage'))
            print "память: ".round(memory_get_peak_usage()/1024/1024, 2)." Мбайт, ";  
        print "время: ".round($exec_time*1000,0)." мÑ.   ";
        print "-->";
    }
Ссылка на сообщение
Поделиться на другие сайты

/products не работает

Как не работает? Не показывает страницу "все товары" или товар отдельно не выводится? Выдаёт 404?

Видимо дело в строке && $_SERVER['QUERY_STRING']!='module=ProductsView'

Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...