как я мог бы использовать ETag в smarty?

#php #smarty #etag

#php #smarty #etag

Вопрос:

Я использую smarty в качестве движка шаблонов, и YSlow (дополнение для Firefox) сообщает мне, что мой флаг Etag равен «F», но я использую smarty. как я мог бы использовать Etag с smarty, и моим основным tpl является framework.tpl, а все остальные шаблоны присваиваются ему

Комментарии:

1. AFAIK ETags на самом деле не имеют большого отношения к Smarty…

2. Лучшие практики для ускорения работы вашего веб-сайта скорее предлагают не использовать ETag .

3. @Gumbo Это верно только для кластеров серверов в конфигурации Apache / IIS по умолчанию. Это не относится к сайтам с небольшим временем работы на одном сервере, и ETags, выполненные правильно, все еще чрезвычайно полезны.

4. Обратите внимание, что оценка YSlow была разработана для конкретной ситуации Yahoo; ETags, как правило, не необходимы (хотя они могут быть полезны, когда хорошо сочетаются с другими директивами кэширования). Другими словами, это информативная оценка, а не жесткие правила, которым вам отчаянно нужно соответствовать. Смотрите также это: codinghorror.com/blog/2007/08 /…

Ответ №1:

Если вы решите, что вам действительно нужны ETags на ваших страницах (что отличается от их реализации просто для прохождения несколько произвольного теста), у меня был хороший опыт работы с этим (более старым) скриптом: http://simonwillison.net/2003/Apr/23/conditionalGet

Обратите внимание, что на самом деле это не зависит от Smarty, поскольку Smarty имеет дело с шаблонами страниц; весь этот «условный запрос» (с ETag и последним изменением и еще много чего) происходит в заголовках HTTP, поэтому приведенный выше код — это просто PHP.

Вам нужно определить время последней модификации вашего ресурса (которое может отличаться от времени модификации файла — например, когда в последний раз изменялась соответствующая часть базы данных?) и передать его doConditionalGet($timestamp) ; затем он либо отправит 304 и завершит работу, либо вернется обратно к вам (что означает, что вам нужно выполнить полную обработку страницы, как если бы не было никакого условного запроса).

Ответ №2:

Просто, но директива

 FileETag None
  

в вашем файле .htaccess отключите поле заголовка ETag. YSlow больше не будет жаловаться … 🙂

Ответ №3:

Вы можете использовать выходной фильтр в Smarty. Ниже приведен некоторый готовый к использованию код для создания ETag:

 function etag_handler($output)
{
    $etag = md5($output);
    header('ETag: '.$etag);
    if (isset($_SERVER['HTTP_IF_NONE_MATCH']) amp;amp; strpos($_SERVER['HTTP_IF_NONE_MATCH'], $etag) !== FALSE)
    {
        header($_SERVER['SERVER_PROTOCOL'].' 304 Not Modified');
        return '';
    }
    return $output;
}

$smarty->registerFilter('output', 'etag_handler');
  

Положи это куда-нибудь раньше $smarty->display(...); .

Обратите внимание, что с помощью этого кода сервер по-прежнему вычисляет выходные данные, но если у клиента уже есть идентичный ответ, сервер не будет отправлять его снова, так что это просто экономия сетевого трафика. Если вы хотите сэкономить вычислительную мощность на сервере, вам нужно сделать что-то еще (кэширование), но вы можете комбинировать это с пометкой ETag.