Перейти к содержимому


Фото
- - - - -

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


  • Чтобы отвечать, сперва войдите на форум
7 ответов в теме

#1 question

question
  • Пользователь
  • 80 сообщений
  • Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Россия

Опубликовано 21.08.2018 - 18:55

Это - код файла 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, 21.08.2018 - 19:34


#2 Drake777

Drake777
  • Пользователь
  • 8 сообщений

Опубликовано 21.08.2018 - 20:31

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

 

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



#3 question

question
  • Пользователь
  • 80 сообщений
  • Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Россия

Опубликовано 21.08.2018 - 23:24

Я просто предложил вот такой вариант, правится всего 1 файл.



#4 phukortsin

phukortsin
  • Пользователь
  • 391 сообщений
  • Программирование, Пользователь
  • Версия CMS:2.x
  • Откуда:Львов

Опубликовано 22.08.2018 - 10:19

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

 

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



#5 question

question
  • Пользователь
  • 80 сообщений
  • Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Россия

Опубликовано 22.08.2018 - 11:14

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

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

_________

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

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

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

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

_________

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

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



#6 DaVinci

DaVinci
  • Фрилансер
  • 1 019 сообщений
  • Программирование, Верстка
  • Версия CMS:1.x, 2.x
  • Откуда:SimplaDev.ru

Опубликовано 22.08.2018 - 11:45

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

_________

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

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

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

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

_________

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

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

 

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


Изменено: DaVinci, 22.08.2018 - 11:59


#7 sergeevizh

sergeevizh
  • Пользователь
  • 99 сообщений
  • Откуда:Москва

Опубликовано 22.08.2018 - 11:51

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

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

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 "-->";
    }


#8 question

question
  • Пользователь
  • 80 сообщений
  • Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Россия

Опубликовано 22.08.2018 - 12:10

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

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

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






0 пользователей читают эту тему

0 пользователей, 0 гостей, 0 скрытых