Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Изучаем HTTP Cache с Symfony2

101b5adab18a468a3dfe63f77980ccb9?s=47 Roma
December 01, 2012

Изучаем HTTP Cache с Symfony2

Symfony CAMP UA 2012, 01.12.2012
- Что такое web cache в целом и зачем его использовать
- Типы кэширования, использующих заголовки
- HTTP Cache headers, описание, отличия, подробности, правила, нюансы (safe, public/private)
- Symfony2 Reverse Proxy: что, как, зачем и почему. Настройки и на что они влияют
- Expiration Model и Validation Model
- Инвалидация кэша
- ESI

101b5adab18a468a3dfe63f77980ccb9?s=128

Roma

December 01, 2012
Tweet

Transcript

  1. Роман Лапин, Evercode Lab roma@evercodelab.com @memphys Изучаем HTTP Cache с

    Symfony2
  2. Что такое кэш?

  3. Что представляет моя мама

  4. Что представляют мои друзья

  5. Что подсказывает google

  6. Что такое кэш на самом деле Промежуточное хранение данных и

    результатов для ускорения повторных запросов к ним.
  7. Что такое HTTP Cache HTTP Specification – RFC 2616, Section

    13
  8. Что такое HTTP Cache “Web caching is one of the

    most misunderstood technologies on the Internet.” http://www.mnot.net/cache_docs/
  9. Немного статистики http://httparchive.org/interesting.php?a=All&l=Nov%201%202012#max-age

  10. Немного статистики http://httparchive.org/trends.php?s=All&minlabel=Nov+1+2011&maxlabel=Nov+1+2012#maxageNull

  11. Немного статистики

  12. Почему это важно •Latency •Traffic •CPU •Cash •Happiness

  13. Типы HTTP Cache

  14. Browser

  15. Proxy Internet

  16. Proxy

  17. Gateway (reverse proxy) Internet

  18. Gateway (reverse proxy)

  19. Public vs Private

  20. Safe Methods •GET & HEAD •Приложение не меняет состояние •PUT,

    POST и DELETE не кэшируются
  21. Заголовки ответов

  22. Заголовки ответов •Cache-Control •Expires •ETag •Last-Modified

  23. Symfony2?

  24. Заголовки ответов. API $response = new Response(); $response->setPublic(); $response->setPrivate(); $response->setMaxAge(600);

    $response->setSharedMaxAge(600); $response->headers->addCacheControlDirective('must-revalidate', true); $response->setExpires($date); $response->setETag(md5($response->getContent())); $response->setLastModified($date);
  25. Заголовки ответов. API $response->expire(); $response->setNotModified(); // Set cache settings in

    one call $response->setCache(array( 'etag' => $etag, 'last_modified' => $date, 'max_age' => 10, 's_maxage' => 10, 'public' => true, // 'private' => true, ));
  26. Symfony2 Reverse Proxy

  27. <?php // web/app.php require_once __DIR__.'/../app/bootstrap.php.cache'; require_once __DIR__.'/../app/AppKernel.php'; require_once __DIR__.'/../app/AppCache.php'; use

    Symfony\Component\HttpFoundation\Request; $kernel = new AppKernel('prod', false); $kernel->loadClassCache(); // wrap the default AppKernel with the AppCache one $kernel = new AppCache($kernel); $request = Request::createFromGlobals(); $response = $kernel->handle($request); $response->send(); $kernel->terminate($request, $response); Symfony2 Reverse Proxy
  28. Symfony2 Reverse Proxy It’s that easy!

  29. // app/AppCache.php use Symfony\Bundle\FrameworkBundle\HttpCache\HttpCache; class AppCache extends HttpCache { protected

    function getOptions() { return array( 'debug' => false, 'default_ttl' => 0, 'private_headers' => array( 'Authorization', 'Cookie' ), 'allow_reload' => false, 'allow_revalidate' => false, 'stale_while_revalidate' => 2, 'stale_if_error' => 60, ); } } Symfony2 Reverse Proxy
  30. HTTP Expiration and Validation

  31. Expiration http://www.flickr.com/photos/urbancamper/

  32. $date = new DateTime(); $date->modify('+3600 seconds'); $response->setExpires($date); Expires: Thu, 01

    Mar 2011 16:00:00 GMT Expiration c Expires •Date header •<= 1 год
  33. // set the private or shared max age $response->setMaxAge(3600); $response->setSharedMaxAge(3600);

    Cache-Control: max-age=3600, s-maxage=3600 Expiration c Cache control
  34. Validation http://www.flickr.com/photos/my-photos-for-all/

  35. public function indexAction() { $response = $this->render('MyBundle:Main:index.html.twig'); $response->setETag(md5($response->getContent())); $response->setPublic(); $response->isNotModified($this->getRequest());

    return $response; } Validation c ETag
  36. $projectDate = new \DateTime($latestProject->getUpdatedAt()); $response->setLastModified($projectDate); $response->setPublic(); if ($response->isNotModified($this->getRequest())) { return

    $response; } // ... more work with content of the response or just render return $response; Validation c Last-Modified
  37. Edge Side Includes <!DOCTYPE html> <html> <body> <!-- ... some

    content --> <!-- Embed the content of another page here --> <esi:include src="http://..." /> <!-- ... more content --> </body> </html>
  38. # app/config/config.yml framework: # ... esi: { enabled: true }

    # app/config/routing.yml _internal: resource: "@FrameworkBundle/Resources/config/routing/ internal.xml" prefix: /_internal ESI
  39. public function indexAction() { $response = $this->render( 'AppDefaultBundle:Default:index.html.twig' ); //

    marks the response as public $response->setSharedMaxAge(30*24*60*60); return $response; } ESI
  40. {% render 'AppMainBundle:Default:blog', {'standalone': true} %} public function blogAction() {

    // ... $response->setSharedMaxAge(3*24*60*60); } ESI
  41. {% render "KnpLastTweetsBundle:Twitter:lastTweets" with {'username': 'evercodelab', 'limit': 3, 'age': 12*60*60},

    {'standalone': true} %} ESI
  42. Cache Invalidation

  43. •Инвалидация HTTP Cache не нужна •если все сделано правильно •Специфична

    для каждого reverse proxy •PURGE HTTP Method Cache Invalidation
  44. Пример

  45. Пример

  46. Пример •Клиенты и проекты •Блог •Twitter •indexAction — 30 дней

    •Блог — 3 дня •Twitter — 12 часов s-maxage
  47. Пример

  48. Что почитать •Caching Tutorial (http://www.mnot.net/cache_docs/) •Web Cache (http://en.wikipedia.org/wiki/Web_cache) •HTTP Cache

    (http://symfony.com/doc/2.0/book/http_cache.html) •Cache them if you can (http://www.stevesouders.com/blog/ 2012/03/22/cache-them-if-you-can/) •Things Caches Do (http://tomayko.com/writings/things-caches- do)
  49. “The fastest HTTP request is the one not made.” Немного

    философии
  50. Вопросы? Роман Лапин, Evercode Lab roma@evercodelab.com @memphys Спасибо!