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

Изучаем HTTP Cache с Symfony2

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

Roma

December 01, 2012
Tweet

More Decks by Roma

Other Decks in Technology

Transcript

  1. Роман Лапин, Evercode Lab
    [email protected]
    @memphys
    Изучаем HTTP Cache с
    Symfony2

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  7. Что такое HTTP Cache
    HTTP Specification – RFC 2616, Section 13

    View Slide

  8. Что такое HTTP Cache
    “Web caching is one of
    the most
    misunderstood
    technologies on the
    Internet.”
    http://www.mnot.net/cache_docs/

    View Slide

  9. Немного статистики
    http://httparchive.org/interesting.php?a=All&l=Nov%201%202012#max-age

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  13. Типы HTTP Cache

    View Slide

  14. Browser

    View Slide

  15. Proxy
    Internet

    View Slide

  16. Proxy

    View Slide

  17. Gateway (reverse proxy)
    Internet

    View Slide

  18. Gateway (reverse proxy)

    View Slide

  19. Public vs Private

    View Slide

  20. Safe Methods
    •GET & HEAD
    •Приложение не меняет состояние
    •PUT, POST и DELETE не кэшируются

    View Slide

  21. Заголовки ответов

    View Slide

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

    View Slide

  23. Symfony2?

    View Slide

  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);

    View Slide

  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,
    ));

    View Slide

  26. Symfony2 Reverse
    Proxy

    View Slide

  27. // 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

    View Slide

  28. Symfony2 Reverse Proxy
    It’s that easy!

    View Slide

  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

    View Slide

  30. HTTP Expiration and
    Validation

    View Slide

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

    View Slide

  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 год

    View Slide

  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

    View Slide

  34. Validation
    http://www.flickr.com/photos/my-photos-for-all/

    View Slide

  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

    View Slide

  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

    View Slide

  37. Edge Side Includes









    View Slide

  38. # app/config/config.yml
    framework:
    # ...
    esi: { enabled: true }
    # app/config/routing.yml
    _internal:
    resource: "@FrameworkBundle/Resources/config/routing/
    internal.xml"
    prefix: /_internal
    ESI

    View Slide

  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

    View Slide

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

    View Slide

  41. {% render "KnpLastTweetsBundle:Twitter:lastTweets" with
    {'username': 'evercodelab', 'limit': 3, 'age': 12*60*60},
    {'standalone': true}
    %}
    ESI

    View Slide

  42. Cache Invalidation

    View Slide

  43. •Инвалидация HTTP Cache не нужна
    •если все сделано правильно
    •Специфична для каждого reverse proxy
    •PURGE HTTP Method
    Cache Invalidation

    View Slide

  44. Пример

    View Slide

  45. Пример

    View Slide

  46. Пример
    •Клиенты и проекты
    •Блог
    •Twitter
    •indexAction — 30 дней
    •Блог — 3 дня
    •Twitter — 12 часов
    s-maxage

    View Slide

  47. Пример

    View Slide

  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)

    View Slide

  49. “The fastest HTTP
    request is the one not
    made.”
    Немного философии

    View Slide

  50. Вопросы?
    Роман Лапин, Evercode Lab
    [email protected]
    @memphys
    Спасибо!

    View Slide