Автор Тема: Как правильно настроить Last-modify  (Прочитано 245 раз)

14 Апрель 2021, 10:27:01
  • Старожил
  • ****
  • Сообщений: 488
  • Репутация: +1/-0
  • Сообщество PrestaShop
    • Просмотр профиля
День добрый,

Нужно настроить Last-modify в наличии P.S. 1.6.

Думаю добавить в config.inc.phpследующий код:

<?php
$LastModified_unix 
strtotime(date("D, d M Y H:i:s"filectime($_SERVER['SCRIPT_FILENAME'])));
$LastModified gmdate("D, d M Y H:i:s \G\M\T"$LastModified_unix);
$IfModifiedSince false;

if (isset(
$_ENV['HTTP_IF_MODIFIED_SINCE']))
   
$IfModifiedSince strtotime(substr ($_ENV['HTTP_IF_MODIFIED_SINCE'], 5));

if (isset(
$_SERVER['HTTP_IF_MODIFIED_SINCE']))
   
$IfModifiedSince strtotime(substr ($_SERVER['HTTP_IF_MODIFIED_SINCE'], 5));

if (
$IfModifiedSince && $IfModifiedSince >= $LastModified_unix) {
   
header($_SERVER['SERVER_PROTOCOL'] . ' 304 Not Modified');
   exit;
}
header('Last-Modified: '$LastModified);
?>

Подойдёт ли такой вариант?
14 Апрель 2021, 11:26:02
Ответ #1
  • Ветеран
  • *****
  • Сообщений: 1746
  • Репутация: +47/-1
  • Сообщество PrestaShop
    • Просмотр профиля
Файлы не меняются, меняется дата редактирования товара или дата кеширования, по ним и настраивать нужно.
14 Апрель 2021, 11:51:35
Ответ #2
  • Ветеран
  • *****
  • Сообщений: 16450
  • Репутация: +14622/-5
  • Сообщество PrestaShop
    • Просмотр профиля
Я бы переопределил displayHeader в FrontController. Логичнее будет. Этот метод выводит заголовки.
14 Апрель 2021, 12:06:07
Ответ #3
  • Ветеран
  • *****
  • Сообщений: 33312
  • Репутация: +26770/-0
    • Просмотр профиля
Если кеширование включено, тогда дата изменения документа определеется smarty
Smarty.class.php
/**
 * check If-Modified-Since headers
 *
 * @var boolean
 */
public $cache_modified_check = false;
....
if ($this->cache_modified_check) {
    $_server_vars = ($this->request_use_auto_globals) ? $_SERVER : $GLOBALS['HTTP_SERVER_VARS'];
    $_last_modified_date = @substr($_server_vars['HTTP_IF_MODIFIED_SINCE'], 0, strpos($_server_vars['HTTP_IF_MODIFIED_SINCE'], 'GMT') + 3);
    $_gmt_mtime = gmdate('D, d M Y H:i:s', $this->_cache_info['timestamp']).' GMT';
    if (@count($this->_cache_info['insert_tags']) == 0 && !$this->_cache_serials && $_gmt_mtime == $_last_modified_date) {
        if (php_sapi_name()=='cgi')
            header('Status: 304 Not Modified');
        else
            header('HTTP/1.1 304 Not Modified');
    } else {
        header('Last-Modified: '.$_gmt_mtime);
        echo $_smarty_results;
}
...
$this->_cache_info['template'][$resource_name] = true;
if ($this->cache_modified_check && $display) {
   header('Last-Modified: '.gmdate('D, d M Y H:i:s', time()).' GMT');
}
14 Апрель 2021, 14:12:45
Ответ #4
  • Партнер
  • Ветеран
  • ****
  • Сообщений: 22803
  • Репутация: +17140/-1
  • Разработка веб-сайтов и веб-программирование
    • Просмотр профиля
По умолчанию, в prestashop это уже есть.  Движок Prestashop кэширует страницы, создавая и отдавая фактически статичные файлы, веб-сервер, если настроен, будет правильно отвечать на условные запросы при изменении временной метки файлов кеширования.
Интернет-магазин под ключ.
Какой выбрать движок для интернет магазина ?
Какой движок лучше ?
Magento или Prestashop ?
Решение всех Ваших вопросов в создании Интернет-магазина.
14 Апрель 2021, 15:51:25
Ответ #5
  • Старожил
  • ****
  • Сообщений: 488
  • Репутация: +1/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Спасибо за помощь.

Подскажите, я правильно понимаю, что необходимо в первую очередь настроить веб сервер, а именно:

для nginx
настроить config (nginx в директиве server if_modified_since exact).
http://nginx.org/ru/docs/http/ngx_http_core_module.html#if_modified_since,чтобы сервер отдавал эти заголовки браузеру и роботу поисковика.

После этого всё должно взлететь автоматом?
14 Апрель 2021, 16:49:49
Ответ #6
  • Партнер
  • Ветеран
  • ****
  • Сообщений: 22803
  • Репутация: +17140/-1
  • Разработка веб-сайтов и веб-программирование
    • Просмотр профиля
Подскажите, я правильно понимаю, что необходимо в первую очередь настроить веб сервер, а именно:
Да, если настроен сервер, то все ок.
В движке уже есть отдача заголовка.
Проверяете свой сайт
https://yandex.ru/search/?text=%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0%20%20Last-modify&lr=10377
если если есть замечания, изменяете настройки сервера.
Интернет-магазин под ключ.
Какой выбрать движок для интернет магазина ?
Какой движок лучше ?
Magento или Prestashop ?
Решение всех Ваших вопросов в создании Интернет-магазина.
14 Апрель 2021, 17:26:48
Ответ #7
  • Старожил
  • ****
  • Сообщений: 488
  • Репутация: +1/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Ещё один вопрос.

Есть популярный модуль кеширования под Prestahop, называется:
Express Cache 3
Подскажите, есть ли смысл совмещать вместе эти функционалы, т.е. тот который описан выше и Express Cache 3.

Какие будут плюсы/минусы?
15 Апрель 2021, 10:57:05
Ответ #8
  • Ветеран
  • *****
  • Сообщений: 16450
  • Репутация: +14622/-5
  • Сообщество PrestaShop
    • Просмотр профиля
Модуль имеет смысл устанавливать когда вы сами ничего не делаете с сайтом и хостингом. В этом смысл модуле.
А раз сами возитесь, то модуль не нужен.
15 Апрель 2021, 11:44:38
Ответ #9
  • Фрилансер
  • *
  • Сообщений: 123
  • Репутация: +2/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Express Cache кеширует отдельные страницы, в движке такого нет. На шаред хостинге самому многое не сделать, с модулем можно улучшить скорость.
15 Апрель 2021, 11:59:27
Ответ #10
  • Ветеран
  • *****
  • Сообщений: 22072
  • Репутация: +25301/-1
  • Prestashop - просто и эффективно
    • Просмотр профиля
Express Cache кеширует отдельные страницы, в движке такого нет. На шаред хостинге самому многое не сделать, с модулем можно улучшить скорость.
Есть такое в движке. Если сами не можете реализовать, то можно клон prestashop установить там уже в админке кеширование настроить можно.
https://thirtybees.com/download/
Эксперт Prestashop - решения всех проблем, написание модулей, создание тем для интернет-магазинов под Prestashop.
Эксперт Magento - создам сайт на Magento, программирование кастомных модулей для Magento, кастомизация тем Magento.
Лучшие цены!!!
16 Апрель 2021, 08:34:58
Ответ #11
  • Старожил
  • ****
  • Сообщений: 488
  • Репутация: +1/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Если кеширование включено, тогда дата изменения документа определеется smarty
Smarty.class.php
....
if ($this->cache_modified_check) {
    $_server_vars = ($this->request_use_auto_globals) ? $_SERVER : $GLOBALS['HTTP_SERVER_VARS'];
    $_last_modified_date = @substr($_server_vars['HTTP_IF_MODIFIED_SINCE'], 0, strpos($_server_vars['HTTP_IF_MODIFIED_SINCE'], 'GMT') + 3);
    $_gmt_mtime = gmdate('D, d M Y H:i:s', $this->_cache_info['timestamp']).' GMT';
    if (@count($this->_cache_info['insert_tags']) == 0 && !$this->_cache_serials && $_gmt_mtime == $_last_modified_date) {
        if (php_sapi_name()=='cgi')
            header('Status: 304 Not Modified');
        else
            header('HTTP/1.1 304 Not Modified');
    } else {
        header('Last-Modified: '.$_gmt_mtime);
        echo $_smarty_results;
}
...
$this->_cache_info['template'][$resource_name] = true;
if ($this->cache_modified_check && $display) {
   header('Last-Modified: '.gmdate('D, d M Y H:i:s', time()).' GMT');
}

Подскажите, какую версию P.S. используете.
Просто у меня в Smarty.class.php данный код отсутствует.
Есть подобное, но только в smarty_internal_templatebase.php

           if ($this->caching && $this->cache_modified_check) {
                $_isCached = $_template->isCached() && !$_template->has_nocache_code;
                $_last_modified_date = @substr($_SERVER['HTTP_IF_MODIFIED_SINCE'], 0, strpos($_SERVER['HTTP_IF_MODIFIED_SINCE'], 'GMT') + 3);
                if ($_isCached && $_template->cached->timestamp <= strtotime($_last_modified_date)) {
                    switch (PHP_SAPI) {
                        case 'cgi': // php-cgi < 5.3
                        case 'cgi-fcgi': // php-cgi >= 5.3
                        case 'fpm-fcgi': // php-fpm >= 5.3.3
                            header('Status: 304 Not Modified');
                            break;

                        case 'cli':
                            if (/* ^phpunit */
                            !empty($_SERVER['SMARTY_PHPUNIT_DISABLE_HEADERS']) /* phpunit$ */
                            ) {
                                $_SERVER['SMARTY_PHPUNIT_HEADERS'][] = '304 Not Modified';
                            }
                            break;

                        default:
                            header($_SERVER['SERVER_PROTOCOL'] . ' 304 Not Modified');
                            break;
                    }
                } else {
                    switch (PHP_SAPI) {
                        case 'cli':
                            if (/* ^phpunit */
                            !empty($_SERVER['SMARTY_PHPUNIT_DISABLE_HEADERS']) /* phpunit$ */
                            ) {
                                $_SERVER['SMARTY_PHPUNIT_HEADERS'][] = 'Last-Modified: ' . gmdate('D, d M Y H:i:s', $_template->cached->timestamp) . ' GMT';
                            }
                            break;

                        default:
                            header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $_template->cached->timestamp) . ' GMT');
                            break;
                    }
                    echo $_output;
                }
            }

С чем связаны такие расхождения?
16 Апрель 2021, 11:43:08
Ответ #12
  • Ветеран
  • *****
  • Сообщений: 22072
  • Репутация: +25301/-1
  • Prestashop - просто и эффективно
    • Просмотр профиля
Есть подобное, но только в smarty_internal_templatebase.php
С чем связаны такие расхождения?
В prestashop smarty адаптирован под движок. Поэтому этот код в smarty_internal_templatebase.php, все правильно.
Эксперт Prestashop - решения всех проблем, написание модулей, создание тем для интернет-магазинов под Prestashop.
Эксперт Magento - создам сайт на Magento, программирование кастомных модулей для Magento, кастомизация тем Magento.
Лучшие цены!!!
16 Апрель 2021, 12:26:20
Ответ #13
  • Ветеран
  • *****
  • Сообщений: 33312
  • Репутация: +26770/-0
    • Просмотр профиля
Расхождения связанны с кастомизацией движка. У вас в smarty_internal_templatebase.php, это нормально для smarty 3.x... (у меня v2). При cache_modified_check=true, Smarty будет учитывать If-Modified-Since заголовок, посланный клиентом. Если время создания кэшированного файла не изменилось с момента последнего посещения, то взамен его содержимого будет послан заголовок "304 Not Modified".
16 Апрель 2021, 16:05:12
Ответ #14
  • Старожил
  • ****
  • Сообщений: 488
  • Репутация: +1/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Подскажите,

Сейчас, после настройки web сервера nginx, наблюдаю следующее:
При обращении к статичному контенту (html, jpg и т.д.) заголовок Last-Modified возвращается нормально. Если же обращаюсь к динамичному контенту (php), то Last-Modified не возвращается.

Кто нибудь решал проблему с динамическим контентом и Last-Modified

Ни у кого не возникало такой проблемы?