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 full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  13. Типы HTTP Cache

    View full-size slide

  14. Proxy
    Internet

    View full-size slide

  15. Gateway (reverse proxy)
    Internet

    View full-size slide

  16. Gateway (reverse proxy)

    View full-size slide

  17. Public vs Private

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  21. Заголовки ответов. 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 full-size slide

  22. Заголовки ответов. 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 full-size slide

  23. Symfony2 Reverse
    Proxy

    View full-size slide

  24. // 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 full-size slide

  25. Symfony2 Reverse Proxy
    It’s that easy!

    View full-size slide

  26. // 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 full-size slide

  27. HTTP Expiration and
    Validation

    View full-size slide

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

    View full-size slide

  29. $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 full-size slide

  30. // 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 full-size slide

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

    View full-size slide

  32. 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 full-size slide

  33. $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 full-size slide

  34. Edge Side Includes









    View full-size slide

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

    View full-size slide

  36. 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 full-size slide

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

    View full-size slide

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

    View full-size slide

  39. Cache Invalidation

    View full-size slide

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

    View full-size slide

  41. Пример

    View full-size slide

  42. Пример

    View full-size slide

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

    View full-size slide

  44. Пример

    View full-size slide

  45. Что почитать
    •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 full-size slide

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

    View full-size slide

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

    View full-size slide