2013-09-18 6 views
7

Я пытаюсь отключить кеш-ключ в режиме prod или заставить его перекомпилировать мои представления.Symfony2: disable Twig cache

Я использую KnapLaps SnappyBundle для создания некоторых PDF-файлов (такая же проблема возникает с DomPDF), и у меня есть динамический контент для рендеринга.

В режиме dev я могу изменить какой-либо текст или даже некоторые свойства css, изменения вступают в силу немедленно.

Но в режиме prod мне нужно кэшировать: clear или rm -rf app/cache/prod/twig/*, чтобы увидеть изменения.

Я попытался следующие варианты в моем config.yml для раздела Twig (не в то же самое время)

cache: "/dev/null" 
cache: false 
auto-reload: ~ 

Я также попробовать некоторые вещи с заголовком при создании и redering моего PDF:

$html = $this->renderView("xxxxPdfBundle:Pdf:test.html.twig", array("foo" => $bar)); 
return new Response(
    $this->get('knp_snappy.pdf')->getOutputFromHtml($html), 
    200, 
    array(
     'Cache-Control'   => 'no-cache, must-revalidate, post-check=0, pre-check=0', 
     'Content-Type'   => 'application/pdf', 
     'Content-Disposition' => 'attachment; filename='.$file 
    ) 
); 

Я не могу понять, как заставить веточку перекомпилировать или не использовать приложение/кеш, потому что, очевидно, содержимое pdf будет динамичным при производстве.

информация Обновление от комментариев:

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

После очистки всех кэшей эта проблема исправлена: теперь создаются PDF-файлы с динамическим контентом.

Тем не менее, остается вопрос: что делать, когда мой сайт находится в процессе производства, я решил изменить стиль CSS внутри шаблона pdf? CSS не является переменной шаблона, и я не могу заставить людей пустить их кеш:/

+0

Have вы проверили, что части в шаблоне, которые должны быть динамическими (то есть переменные шаблона) НЕ изменяются при включенном кеше в процессе производства? Я считаю, что это желаемая функция, чтобы не компилировать шаблон снова и снова в процессе производства и просто очищать кеш при развертывании новой версии из-за производительности. – Sven

+0

@Sven Динамические части (я использовал, например, {{foo.name}}) не обновлялись в сгенерированном PDF-файле в процессе производства, если я не очистил кеш:/В режиме dev {{foo.name}} хорошо отображается и обновляется в каждом PDF-файле без необходимости очищать кеш ... – sylzys

+0

Используете ли вы это [расширение для twig-cache] (https://github.com/asm89/twig-cache-extension) - мое впечатление от некоторые вопросы и комментарии заключаются в том, что сам твиг не сохранит результат, который когда-то был сгенерирован, так почему же вы это испытываете? – Sven

ответ

2

Вопрос о кешировании на стороне клиента имеет некоторые ответы.

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

Первый вид кеширования можно обновить только путем удаления кеша клиента в браузере. Второй, вероятно, можно было бы обойти путем принудительной загрузки страницы снова (Ctrl-F5 или около того), но это действительно так же скрыто, как и меню, позволяющее очистить кеш.

Чтобы играть в безопасное место, обычным подходом было бы добавить тег, номер ревизии, увеличивающийся счетчик или все, что доступно, в строку запроса URL-адреса, используемого для этого ресурса.

  1. http://example.com/generated/summary.pdf?v=1234
  2. http://example.com/generated/summary.pdf?v=1235

Первый URL от запуска развертывания 1234, второй из 1235 - это число изменяет URL достаточно, чтобы вызвать новый запрос вместо того, чтобы старую версию из кэш.

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

13

Правильный способ отключить механизм кэширования прутик является установить параметр cache окружения false вместо каталога кэша:

# config_dev.yml 
# ... 
twig: 
    cache: false 

Ссылки:

Twig Environment Options

TwigBundle Configuration