Successfully reported this slideshow.
Your SlideShare is downloading. ×

Caching on the Edge with Symfony2

Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad

Check these out next

1 of 53 Ad

More Related Content

Similar to Caching on the Edge with Symfony2 (20)

Advertisement

More from Fabien Potencier (19)

Recently uploaded (20)

Advertisement

Caching on the Edge with Symfony2

  1. 1. Caching on the Edge Fabien Potencier
  2. 2. Let’s run some benchmarks ;)
  3. 3. cacheable for 10 seconds Lorem  ipsum  dolor  sit  amet,  consectetur  adipiscing  elit.  In  vel  nulla  arcu,   vitae  cursus  nunc.  Integer  semper  turpis  et  enim  por6tor  iaculis.  Nulla   facilisi.  Lorem  ipsum  dolor  sit  amet,  consectetur  adipiscing  elit.  Mauris   vehicula  ves;bulum  dictum.  Aenean  non  velit  tortor.  Nullam  adipiscing   malesuada  aliquam.  Mauris  dignissim,  urna  quis  iaculis  tempus,  justo  libero   por6tor  est,  nec  eleifend  est  elit  vitae  ante.  Curabitur  interdum  luctus   metus,  in  pulvinar  lectus  rutrum  sit  amet.  Duis  gravida,  metus  in  dictum   eleifend,  dolor  risus  ;ncidunt  ligula,  non  volutpat  nulla  sapien  in  elit.  Nulla   rutrum  erat  id  neque  suscipit  eu  ultricies  odio  sollicitudin.  Aliquam  a  mi  vel   eros  placerat  hendrerit.  Phasellus  por6tor,  augue  sit  amet  vulputate   venena;s,  dui  leo  commodo  odio,  a  euismod  turpis  ligula  in  elit.  Sed  cursus   tortor  quis  dolor  aliquet  accumsan.     Curabitur  convallis  egestas  erat,  et  pharetra  neque  faucibus  vitae.  Integer  at   urna  leo.  Suspendisse  poten;.  Nulla  hendrerit  nisl  sit  amet  lorem  semper   comes from DB nec  porta  mauris  volutpat.  Curabitur  a  velit  erat,  a  viverra  sem.  Duis  a  eros   nec  diam  faucibus  vehicula  a  sed  orci.  Vivamus  vehicula  dapibus  tellus  in   (simulated) luctus.  Curabitur  luctus,  lorem  ac  pre;um  pharetra,  nisl  risus  condimentum   mi,  sit  amet  placerat  orci  ante  et  velit.  Vivamus  dapibus  nulla  tempor  metus   tris;que  vel  gravida  purus  pre;um.  Curabitur  suscipit  bibendum  massa,  at   imperdiet  purus  interdum  sit  amet.  Donec  ;ncidunt  porta  dictum.  
  4. 4. requests / second 600   500   400   300   symfony   Symfony2   200   100   0   10   30   50   70   90  
  5. 5. For 10 concurrent users, Symfony2 is 5 times faster than symfony
  6. 6. requests / second 600   500   400   300   symfony   Symfony2   200   100   0   10   30   50   70   90   number of concurrent users
  7. 7. For 100 concurrent users, Symfony2 is 11 times faster than symfony
  8. 8. What if I add an HTTP accelerator?
  9. 9. Symfony2 embraces the HTTP specification
  10. 10. HTTP Expiration / HTTP Validation
  11. 11. $response->setSharedMaxAge(...); $response->setTtl(...); $response->setMaxAge(...); $response->setClientTtl(...); $response->setExpires(...); $response->setETag(...); $response->setLastModified(...);
  12. 12. Cache-Control: s-maxage=10
  13. 13. public function showAction() { // ... $response = $this->render('...', $vars); $response->setSharedMaxAge(10); return $response; }
  14. 14. public function showAction() { // ... $response = $this->createResponse(); $response->setSharedMaxAge(10); return $this->render( '...', $vars, $response); }
  15. 15. Symfony 2 comes built-in with an HTTP accelerator
  16. 16. $kernel = new HelloCache( new HelloKernel('prod', false) ); $kernel->handle()->send();
  17. 17. Let’s run some benchmarks… again
  18. 18. cacheable for 10 seconds cacheable for 5 seconds Lorem  ipsum  dolor  sit  amet,  consectetur   Lorem  ipsum  dolor  sit   adipiscing  elit.  In  vel  nulla  arcu,  vitae   amet,  consectetur   cursus  nunc.  Integer  semper  turpis  et  enim   adipiscing  elit.  In  vel  nulla   por6tor  iaculis.  Nulla  facilisi.  Lorem  ipsum   arcu,  vitae  cursus  nunc.   dolor  sit  amet,  consectetur  adipiscing  elit.   Integer  semper  turpis  et   Mauris  vehicula  ves;bulum  dictum.   enim  por6tor  iaculis.   Aenean  non  velit  tortor.  Nullam  adipiscing   Nulla  facilisi.  Lorem  ipsum   malesuada  aliquam.  Mauris  dignissim,  urna   dolor  sit  amet,   quis  iaculis  tempus,  justo  libero  por6tor   consectetur  adipiscing  elit.   est,  nec  eleifend  est  elit  vitae  ante.   Mauris  vehicula   Curabitur  interdum  luctus  metus,  in   ves;bulum  dictum.   pulvinar  lectus  rutrum  sit  amet.  Duis   Aenean  non  velit  tortor.   gravida,  metus  in  dictum  eleifend,  dolor   Nullam  adipiscing   risus  ;ncidunt  ligula,  non  volutpat  nulla   comes from DB malesuada  aliquam.   comes from DB sapien  in  elit.  Nulla  rutrum  erat  id  neque   Mauris  dignissim,  urna   (simulated) suscipit  eu  ultricies  odio  sollicitudin.   (simulated) quis  iaculis  tempus,  justo   Aliquam  a  mi  vel  eros  placerat  hendrerit.   libero  por6tor  est,  nec   Phasellus  por6tor,  augue  sit  amet   eleifend  est  elit  vitae  ante.   vulputate  venena;s,  dui  leo  commodo   Curabitur  interdum  luctus   odio,  a  euismod  turpis  ligula  in  elit.     metus.  
  19. 19. requests / second 600   500   400   300   symfony   Symfony2   200   100   0   10   30   50   70   90   number of concurrent requests
  20. 20. For 10 concurrent users, Symfony2 is 8 times faster than symfony
  21. 21. For 100 concurrent users, Symfony2 is 85 times faster than symfony
  22. 22. cacheable for 10 seconds cacheable for 5 seconds Lorem  ipsum  dolor  sit  amet,  consectetur   Lorem  ipsum  dolor  sit   layout adipiscing  elit.  In  vel  nulla  arcu,  vitae   amet,  consectetur   cursus  nunc.  Integer  semper  turpis  et  enim   adipiscing  elit.  In  vel  nulla   por6tor  iaculis.  Nulla  facilisi.  Lorem  ipsum   arcu,  vitae  cursus  nunc.   dolor  sit  amet,  consectetur  adipiscing  elit.   Integer  semper  turpis  et   Mauris  vehicula  ves;bulum  dictum.   enim  por6tor  iaculis.   Aenean  non  velit  tortor.  Nullam  adipiscing   Nulla  facilisi.  Lorem  ipsum   malesuada  aliquam.  Mauris  dignissim,  urna   dolor  sit  amet,   quis  iaculis  tempus,  justo  libero  por6tor   consectetur  adipiscing  elit.   est,  nec  eleifend  est  elit  vitae  ante.   Mauris  vehicula   Curabitur  interdum  luctus  metus,  in   ves;bulum  dictum.   pulvinar  lectus  rutrum  sit  amet.  Duis   Aenean  non  velit  tortor.   gravida,  metus  in  dictum  eleifend,  dolor   Nullam  adipiscing   risus  ;ncidunt  ligula,  non  volutpat  nulla   malesuada  aliquam.   sapien  main Nulla  rutrum  erat  id  neque   in  elit.   Mauris  dignissim,  in component urna   suscipit  eu  ultricies  odio  sollicitudin.   action quis  iaculis  tempus,  justo   the layout Aliquam  a  mi  vel  eros  placerat  hendrerit.   libero  por6tor  est,  nec   Phasellus  por6tor,  augue  sit  amet   eleifend  est  elit  vitae  ante.   vulputate  venena;s,  dui  leo  commodo   Curabitur  interdum  luctus   odio,  a  euismod  turpis  ligula  in  elit.     metus.   NOT cacheable
  23. 23. <?php $view->extend('...:layout') ?> <?php $view->slots->start('sidebar') ?> <?php echo $view->actions->render('...:list') ?> <?php $view->slots->stop() ?> Lorem ipsum...
  24. 24. cacheable for 10 seconds <?php $view->extend('...:layout') ?> <?php $view->slots->start('sidebar') ?> for 5 seconds cacheable <?php echo $view->actions->render('...:list') ?> <?php $view->slots->stop() ?> Lorem ipsum...
  25. 25. $view->actions->render('...:list', array( 'standalone' => true, ))
  26. 26. Lorem  ipsum  dolor  sit  amet,  consectetur   Lorem  ipsum  dolor  sit   adipiscing  elit.  In  vel  nulla  arcu,  vitae   amet,  consectetur   cursus  nunc.  Integer  semper  turpis  et  enim   adipiscing  elit.  In  vel  nulla   por6tor  iaculis.  Nulla  facilisi.  Lorem  ipsum   arcu,  vitae  cursus  nunc.   dolor  sit  amet,  consectetur  adipiscing  elit.   Integer  semper  turpis  et   Mauris  vehicula  ves;bulum  dictum.   enim  por6tor  iaculis.   Aenean  non  velit  tortor.  Nullam  adipiscing   Nulla  facilisi.  Lorem  ipsum   malesuada  aliquam.  Mauris  dignissim,  urna   dolor  sit  amet,   quis  iaculis  tempus,  justo  libero  por6tor   consectetur  adipiscing  elit.   est,  nec  eleifend  est  elit  vitae  ante.   Mauris  vehicula   Curabitur  interdum  luctus  metus,  in   ves;bulum  dictum.   pulvinar  lectus  rutrum  sit  amet.  Duis   Aenean  non  velit  tortor.   gravida,  metus  in  dictum  eleifend,  dolor   Nullam  adipiscing   risus  ;ncidunt  ligula,  non  volutpat  nulla   malesuada  aliquam.   sapien  in  elit.  Nulla  rutrum  erat  id  neque   Mauris  dignissim,  urna   suscipit  eu  ultricies  odio  sollicitudin.   quis  iaculis  tempus,  justo   Aliquam  a  mi  vel  eros  placerat  hendrerit.   libero  por6tor  est,  nec   Phasellus  por6tor,  augue  sit  amet   eleifend  est  elit  vitae  ante.   vulputate  venena;s,  dui  leo  commodo   Curabitur  interdum  luctus   odio,  a  euismod  turpis  ligula  in  elit.     metus.  
  27. 27. <esi:include src="..." /> Lorem  ipsum  dolor  sit  amet,  consectetur   adipiscing  elit.  In  vel  nulla  arcu,  vitae   cursus  nunc.  Integer  semper  turpis  et  enim   por6tor  iaculis.  Nulla  facilisi.  Lorem  ipsum   dolor  sit  amet,  consectetur  adipiscing  elit.   Mauris  vehicula  ves;bulum  dictum.   Aenean  non  velit  tortor.  Nullam  adipiscing   malesuada  aliquam.  Mauris  dignissim,  urna   quis  iaculis  tempus,  justo  libero  por6tor   est,  nec  eleifend  est  elit  vitae  ante.   Curabitur  interdum  luctus  metus,  in   pulvinar  lectus  rutrum  sit  amet.  Duis   gravida,  metus  in  dictum  eleifend,  dolor   risus  ;ncidunt  ligula,  non  volutpat  nulla   sapien  in  elit.  Nulla  rutrum  erat  id  neque   suscipit  eu  ultricies  odio  sollicitudin.   Aliquam  a  mi  vel  eros  placerat  hendrerit.   Phasellus  por6tor,  augue  sit  amet   vulputate  venena;s,  dui  leo  commodo   odio,  a  euismod  turpis  ligula  in  elit.    
  28. 28. ESI… or Edge Side Includes
  29. 29. Lorem  ipsum   dolor  sit   amet,     1 2 Symfony2 Application Lorem   ipsum   Reverse Proxy dolor   Client 3 Lorem  ipsum   Lorem   dolor  sit   ipsum   amet,     dolor   4
  30. 30. base layout layout Lorem  ipsum  dolor  sit  amet,   Lorem  ipsum  dolor  sit   consectetur  adipiscing  elit.  In  vel  nulla   Lorem  ipsum  dolor  sit   amet,  consectetur   included page main template amet,  consectetur   arcu,  vitae  cursus  nunc.  Integer  semper   included page adipiscing  elit.  In  vel   turpis  et  enim  por6tor  iaculis.  Nulla   adipiscing  elit.  In  vel  nulla   nulla  arcu,  vitae  cursus   facilisi.  Lorem  ipsum  dolor  sit  amet,   arcu,  vitae  cursus  nunc.   nunc.  Integer  semper   consectetur  adipiscing  elit.  Mauris   Integer  semper  turpis  et   turpis  et  enim  por6tor   vehicula  ves;bulum  dictum.  Aenean   enim  por6tor  iaculis.   iaculis.  Nulla  facilisi.   non  velit  tortor.  Nullam  adipiscing   Nulla  facilisi.  Lorem  ipsum   Lorem  ipsum  dolor  sit   malesuada  aliquam.  Mauris  dignissim,   dolor  sit  amet,   amet,  consectetur   urna  quis  iaculis  tempus,  justo  libero   consectetur  adipiscing  elit.   adipiscing  elit.  Mauris   por6tor  est,  nec  eleifend  est  elit  vitae   Mauris  vehicula   vehicula  ves;bulum   ante.  Curabitur  interdum  luctus  metus,   ves;bulum  dictum.   dictum.  Aenean  non   in  pulvinar  lectus  rutrum  sit  amet.  Duis   Aenean  non  velit  tortor.   velit  tortor.  Nullam   gravida,  metus  in  dictum  eleifend,   Nullam  adipiscing   adipiscing  malesuada   dolor  risus  ;ncidunt  ligula,  non   malesuada  aliquam.   aliquam.     volutpat  nulla  sapien  in  elit.  Nulla   Mauris  dignissim,  urna   rutrum  erat  id  neque  suscipit  eu   quis  iaculis  tempus,  justo   Lorem  ipsum  dolor  sit   ultricies  odio  sollicitudin.  Aliquam  a  mi   libero  por6tor  est,  nec   amet,  consectetur   included page vel  eros  placerat  hendrerit.  Phasellus   eleifend  est  elit  vitae  ante.   adipiscing  elit.  In  vel   por6tor,  augue  sit  amet  vulputate   Curabitur  interdum  luctus   nulla  arcu,  vitae   venena;s,  dui  leo  commodo  odio,  a   metus.   cursus  nunc.     euismod  turpis  ligula  in  elit.    
  31. 31. Goal Be as dynamic as needed Hit the application as less as possible
  32. 32. P2Lorem  ipsum  dolor  sit  amet,   Lorem  ipsum  dolor  sit   consectetur  adipiscing  elit.  In  vel  nulla   amet,  consectetur   arcu,  vitae  cursus  nunc.  Integer   adipiscing  elit.  In  vel   semper  turpis  et  enim  por6tor   nulla  arcu,  vitae  cursus   iaculis.  Nulla  facilisi.  Lorem  ipsum   nunc.  Integer  semper   dolor  sit  amet,  consectetur  adipiscing   turpis  et  enim   elit.  Mauris  vehicula  ves;bulum   por6tor  iaculis.  Nulla   dictum.  Aenean  non  velit  tortor.   facilisi.  Lorem  ipsum   Nullam  adipiscing  malesuada  aliquam.   dolor  sit  amet,   P1 Lorem  ipsum  dolor  sit  amet,  consectetur  adipiscing  elit.  In  vel   Mauris  dignissim,  urna  quis  iaculis   tempus,  justo  libero  por6tor  est,  nec   eleifend  est  elit  vitae  ante.  Curabitur   consectetur  adipiscing   elit.  Mauris  vehicula   ves;bulum  dictum.   nulla  arcu,  vitae  cursus  nunc.  Integer  semper  turpis  et  enim   interdum  luctus  metus,  in  pulvinar   Aenean  non  velit   por6tor  iaculis.  Nulla  facilisi.  Lorem  ipsum  dolor  sit  amet,   lectus  rutrum  sit  amet.  Duis  gravida,   consectetur  adipiscing  elit.  Mauris  vehicula  ves;bulum  dictum.   tortor.  Nullam   metus  in  dictum  eleifend,  dolor  risus   adipiscing  malesuada   Aenean  non  velit  tortor.  Nullam  adipiscing  malesuada  aliquam.   Mauris  dignissim,  urna  quis  iaculis  tempus,  justo  libero  por6tor   10S ;ncidunt  ligula,  non  volutpat  nulla   sapien  in  elit.   5S aliquam   est,  nec  eleifend  est  elit  vitae  ante.  Curabitur  interdum  luctus   metus,  in  pulvinar  lectus  rutrum  sit  amet.  Duis  gravida,  metus  in   dictum  eleifend,  dolor  risus  ;ncidunt  ligula,  non  volutpat  nulla   sapien  in  elit.  Lorem  ipsum  dolor  sit  amet,  consectetur  adipiscing   elit.  In  vel  nulla  arcu,  vitae  cursus  nunc.  Integer  semper  turpis  et   Expiration enim  por6tor  iaculis.  Nulla  facilisi.  Lorem  ipsum  dolor  sit  amet,   consectetur  adipiscing  elit.  Mauris  vehicula  ves;bulum  dictum.   Aenean  non  velit  tortor.  Nullam  adipiscing  malesuada  aliquam.   Mauris  dignissim,  urna  quis  iaculis  tempus,  justo  libero  por6tor   10S est,  nec  eleifend  est  elit  vitae  ante.  Curabitur  interdum  luctus   P3 Lorem  ipsum  dolor  sit  amet,   Lorem  ipsum  dolor  sit   metus,  in  pulvinar  lectus  rutrum  sit  amet   consectetur  adipiscing  elit.  In  vel  nulla   amet,  consectetur   arcu,  vitae  cursus  nunc.  Integer   adipiscing  elit.  In  vel   semper  turpis  et  enim  por6tor   Expiration nulla  arcu,  vitae  cursus   iaculis.  Nulla  facilisi.  Lorem  ipsum   nunc.  Integer  semper   dolor  sit  amet,  consectetur  adipiscing   turpis  et  enim   Expiration elit.  Mauris  vehicula  ves;bulum   por6tor  iaculis.  Nulla   dictum.  Aenean  non  velit  tortor.   facilisi.  Lorem  ipsum   Nullam  adipiscing  malesuada  aliquam.   dolor  sit  amet,   Mauris  dignissim,  urna  quis  iaculis   consectetur  adipiscing   & tempus,  justo  libero  por6tor  est,  nec   eleifend  est  elit  vitae  ante.  Curabitur   interdum  luctus  metus,  in  pulvinar   elit.  Mauris  vehicula   ves;bulum  dictum.   Aenean  non  velit   Validation 10S lectus  rutrum  sit  amet.  Duis  gravida,   tortor.  Nullam   metus  in  dictum  eleifend,  dolor  risus   adipiscing  malesuada   ETag ;ncidunt  ligula,  non  volutpat  nulla   sapien  in  elit.   5S aliquam   ETag
  33. 33. PHP SF 300 Web Server P1 100 P2 100 P3 100 symfony app Requests Response
  34. 34. PHP SF 300 Web Server symfony cache P1 10 P2 100 P3 100 symfony app Requests P1 90 Response
  35. 35. PHP SF 201 Web Server symfony cache P1 1 P2 100 P3 100 symfony app Requests P1 99 management! No HTTP Response
  36. 36. PHP SF2 300 Web Server P1 100 P2 100 P3 100 Symfony2 app Requests Response
  37. 37. PHP SF2 140 PHP LIGHT 180 Web Server Symfony2 HTTP proxy P1 10 P2 10 + 20 P3 100 Symfony2 app Requests P1 90 P2 90 Response
  38. 38. PHP SF2 140 PHP LIGHT 0 Reverse proxy Web Server P1 10 P2 10 + 20 P3 100 Symfony2 app Requests P1 90 P2 90 Response
  39. 39. The power is even bigger than what you think…
  40. 40. $view->actions->render('...:list', array( 'standalone' => true, 'ignore_errors' => true, 'alt' => 'BlogBundle:Post:error' )) <esi:include src="..." alt="..." on-error="ignore" />
  41. 41. $view->actions->render( 'http://www.google.com/', array( 'standalone' => true, 'ignore_errors' => true, 'alt' => 'BlogBundle:Post:error' ) )
  42. 42. stale-while-revalidate - rfc5861
  43. 43. stale-if-error - rfc5861
  44. 44. There are only two hard things in Computer Science: cache invalidation and naming things. -- Phil Karlton http://martinfowler.com/bliki/TwoHardThings.html
  45. 45. Code is still experimental and buggy
  46. 46. http://datatracker.ietf.org/wg/httpbis/
  47. 47. Questions?
  48. 48. Sensio S.A. 92-98, boulevard Victor Hugo 92 115 Clichy Cedex FRANCE Tél. : +33 1 40 99 80 80 Contact Fabien Potencier fabien.potencier at sensio.com http://www.sensiolabs.com/ http://www.symfony-project.org/ http://fabien.potencier.org/
  49. 49. http://tomayko.com/writings/things-caches-do http://www.slideshare.net/rtomayko/https-bestkept-secret-caching http://content.newrelic.com/railslab/videos/10-ScalingRails-Client- Side-Caching.mp4 http://content.newrelic.com/railslab/videos/11-ScalingRails-Advanced- HTTP-Caching.mp4
  50. 50. // do only what is needed to compute // the ETag and Last-Modified header values $response = $this->createResponse(); $response->setEtag('post_'.$post->getId()); $response->setLastModified($post->getPublishedAt()); if ($response->isNotModified($this->getRequest())) { return $response; } // do some heavy stuff here return $this->render('...:post', $vars, $response);
  51. 51. // from http://varnish-cache.org/wiki/FAQ/Compression // normalize Accept-Encoding HTTP header protected function lookup(Request $request) { if ($ae = $request->headers->get('Accept-Encoding')) { if (preg_match('/.(jpg|png|gif|gz|tgz|bz2|tbz|mp3|ogg)$/', $request->getRequestUri())) { // no point in compressing these $request->headers->delete('Accept-Encoding'); } elseif (false !== strpos($ae, 'gzip')) { $request->headers->set('Accept-Encoding', 'gzip'); } elseif (false !== strpos($ae, 'deflate')) { $request->headers->set('Accept-Encoding', 'deflate'); } else { // unkown algorithm $request->headers->delete('Accept-Encoding'); } } return parent::lookup($request); }
  52. 52. PHP SF2 60 PHP LIGHT 180 Web Server Symfony2 HTTP proxy Symfony2Validation accel. P2 10 + 20 P3 10 + 20 Symfony2 app Requests P3 90 P2 90 Response
  53. 53. PHP SF2 60 PHP LIGHT 90 Reverse proxy Web Server Symfony2Validation accel. P2 10 + 20 P3 10 + 20 Symfony2 app Requests P3 90 P2 90 Response

×