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. Что такое кэш на самом деле Промежуточное хранение данных и

    результатов для ускорения повторных запросов к ним.
  2. Что такое HTTP Cache “Web caching is one of the

    most misunderstood technologies on the Internet.” http://www.mnot.net/cache_docs/
  3. Заголовки ответов. 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);
  4. Заголовки ответов. 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, ));
  5. <?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
  6. // 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
  7. $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 год
  8. // 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
  9. Edge Side Includes <!DOCTYPE html> <html> <body> <!-- ... some

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

    # app/config/routing.yml _internal: resource: "@FrameworkBundle/Resources/config/routing/ internal.xml" prefix: /_internal ESI
  11. 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
  12. Что почитать •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)