• Save
Nice performance using Sf2 cache wrapping Sf1 application - Paris
Upcoming SlideShare
Loading in...5

Nice performance using Sf2 cache wrapping Sf1 application - Paris



In collaboration with Emmanuel Cohen. ...

In collaboration with Emmanuel Cohen.

At a key moment for online press in France, a major French news company chooses PHP and Symfony to extend its popular web site. We will present the architecture we designed at Sensio Labs to meet a very good performance requirement. We used Symfony2 kernel wrapping symfony 1.4 and relied on loose-coupled applications serving content from heterogeneous backend sources.



Total Views
Views on SlideShare
Embed Views



14 Embeds 2,857

http://www.lafermeduweb.net 2507
http://blogdwich.fr 148
http://www.symfony.es 92
http://pocky.github.com 65
http://www.emmanuelpereira.com 16
http://pocky.github.io 8
http://feeds.feedburner.com 7
http://webcache.googleusercontent.com 4
http://translate.googleusercontent.com 3
http://www.sfexception.com 3
http://www.linkedin.com 1
http://m.lafermeduweb.net 1
http://twitter.com 1
https://www.linkedin.com 1



Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
Post Comment
Edit your comment

Nice performance using Sf2 cache wrapping Sf1 application - Paris Nice performance using Sf2 cache wrapping Sf1 application - Paris Presentation Transcript

  • Nice performance using SF2 cache wrapping sf1 application Marc Weistroff Emmanuel Cohen Sf Live SF 2011 Thursday, March 3 2011
  • Who we are
    • Emmanuel Cohen
    • Project manager at Sensio Labs
    • 4 year experience with PHP5
    • 5+ year experience with Java EE
    • Learned Basic on Amstrad CPC 6128
  • Who we are
    • Marc Weistroff
    • Developer at Sensio Labs since 11/2009
    • Lead developer on this project
    • Experiences with C, and PHP from version 3
    • Encountered programming with Amos Basic on Amiga 500
  • This talk
    • Symfony2
    • symfony 1
    • HTTP Cache
    • Edge Side Includes (ESI)
    • Web architecture
    • Online media
  • Our client
    • L’Express Magazine
    • Express-Roularta Group
    • Magazine created in 1953
    • http://www.lexpress.fr
    • Top 3 French online news
    • Need for speed!
  • The project
    • A cultural knowledge base
    • A bridge between hot news and cultural knowledge
    • An extension of www.lexpress.fr
  • Technical objectives
    • Performance
    • A full scale Proof-of-Concept for the future
    • Keep it Simple
  • Constraints
    • Heterogeneous XML Sources
    • Solution based on symfony 1
    • Adaptability (for future extensions)
  • How does this app work ?
  • Our symfony 1 application design HTML Renderer XML Server OCARI Culture OCARI Content
    • Stores
    • Normalizes
    • Aggregates
    • Serves XML
    Sources deliver heterogeneous data
    • Renders HTML with XSL
    • Renders static layouts
  • Our symfony 1 application design
    • Highly specialized applications
    • Loose coupling
    • Front dedicated to delivering content fast
  • Addressing performance with Symfony2
  • Addressing performance with Sf2
    • With Symfony2 built-in Gateway :
    • HTTP cache
    • ESI : Edge Side Includes
  • Performance with Symfony2 : HTTP Cache
    • HTTP RFC
    • http://tools.ietf.org/wg/httpbis/
    • http://tools.ietf.org/html/draft-ietf-httpbis-p6-cache-12
  • Performance with Symfony2 : HTTP Cache
    • Symfony2 uses HTTP cache headers to handle cache
    • s-maxage or max-age
    • Etag, Last-Modified, If-Modified-Since
    • http://tools.ietf.org/html/draft-ietf-httpbis-p6-cache-12
  • Performance with Symfony2 : HTTP Cache
    • symfony 1
    • Applicative cache
    • Symfony2
    • Light-weight HttpKernel
    • The application is not hit
    • Supports a standard
    • Find out what’s stale
    • The problem of invalidation
    Performance with Symfony2: Cache issues
    • Selective caching
    • Do not regenerate the whole page when you just need to regenerate small parts of it
    Performance with Symfony2: Cache issues
  • Performance with Symfony2: ESI
    • Edge-Side include: A markup language
    • W3C note from Akamai
    • http:// www.w3.org/TR/esi-lang
    • http:// www.akamai.com/html/support/esi.html
  • ESI : A page in lexpress.fr
  • Performance with Symfony2: ESI
    • Each fragment has its own ttl or validation rule => the fragments are selectively refreshed
  • Performance with Symfony2: ESI
    • Dependance is defined once and for all
    • In expiration: simply set your ttl for each fragment
  • How does ESI work?
  • Performance with Symfony2: ESI
    • Represented by an HTML Tag
      • <esi:include src=“/movie/dogma/critics” />
    • Processed by a proxy
    • Transformed into HTTP Request to the application
    • Response is inserted in place of the esi tag
    • HTTP cache is handled independently for each esi tag
  • /movie/dogma
  • /movie/dogma
  • Html Fragment
    • Pure HTML
    • Inserted in lieu of the <esi /> tag
    • No <html>, <body> or <head> tag in this case
  • What you need
    • Any client!
    • A proxy that handles ESI (ie: Varnish or Symfony2)
    • An application that delivers HTML and HTTP cache headers
    • Serve HTML pages that contain ESI tags
  • First request ever Client Proxy Application /movie/dogma /movie/dogma miss Cache-Control: s-maxage=600 /movie/dogma/casting /movie/dogma/critics Cache-Control: s-maxage=3600 Cache-Control: s-maxage=300
  • Request at t+200 Client Proxy Application /movie/dogma hit
  • The application is never hit! As if the complete page was cached in the reverse proxy
  • Request at t+500 Client Proxy Application /movie/dogma /movie/dogma/critics Cache-Control: s-maxage=300 hit
  • The application is partially hit And has to build only a small fragment of the page
  • Pros
    • You use HTTP cache, not the application one.
    • Performance improvements!
    • Granularity: Different cache strategy or TTL on different parts of your page
  • Cons
    • Your app will be hit n times upon the very first request
    • Your app have to be designed to support the rendering of fragments
  • But our app is symfony 1 right ?
    • What to do with your symfony 1 application when you are dying to use Symfony2?
    Wrap it. Our app is symfony 1
  • Our symfony 1 application design HTML Renderer XML Server OCARI Culture OCARI Content Symfony1 wrapper Edge side Symfony2
    • Stores
    • Normalizes
    • Aggregates
    • Serves XML
    Sources deliver heterogeneous data
    • Renders HTML with XSL
    • Renders static layouts
  • Wrapping symfony 1 with Symfony2
  • Constraint
    • We use the Symfony2 ESI/Cache proxy
    • All the call to our app is done in the same PHP process
  • symfony 1 needs tweaking in order to work around a few obstacles
  • Which ones ?
    • It is not reentrant
      • sfConfig singleton
      • sfContext singleton
    • It sends the response directly to the client
      • Filter chain execution
      • At the end, sfRenderingFilter sends the complete response
  • What about Symfony2?
    • Better architecture: Symfony2 is reentrant
    • Symfony2 is heavily based on interfaces
    • Symfony2 is divided into several components
    • HttpKernelHttpKernelInterface
  • HttpKernelHttpKernelInterface
    • Lightweight (1 method)
    • Forces to implement a “handle” method that accepts a Symfony2 Request object and returns a Symfony2 Response object
    • Used by all the classes that act as a Kernel in Symfony2 (ie: HttpKernelHttpCache)
  • Addressing the issues
    • Reentrance
      • Override the super globals
      • Create a fresh new context each time
    • Filter chain
      • Replace sfRenderingFilter by a noRenderingFilter class
    • Create a Symfony2 Response object and returns it
  • Final app architecture EsiCacheKernel SymfonyWrapperKernel symfony 1 application
  • https://github.com/marcw/sflive-2011
  • Then… You have to design your app to serve HTML fragments!
  • Designing your app
    • Don’t think partials or components, think actions!
    • Actions render HTML fragments
    • Actions MUST define explicitly the response cache headers.
  • And now where happy
  • Or are we ?
  • Our choices
    • The choice of symfony 1
    • The choice of Symfony2
    • The choice to mix
    • Expiration over validation
  • This is symfony1 : DO NOT TRY ANY OF THIS AT HOME!
  • Our results
    • It works!
    • The frontend is scalable and extensible
    • Performance is nice, but we needed to improve the Store.php class
  • What to do next ?
  • Implementing cache validation
    • The application needs to garantee freshness
    • How to avoid hitting the application ?
  • Proxy ESI New response Or 304 URL-> {ETag} ETag-> lastmodified If Etag absent or stale Response with HTTP headers Etag LastModified Client Request with HTTP headers If-None-Match If-Modified-Since App New response Or 304 If cache entry is not fresh enough Cache Validation Optimizer
  • Contact @ L’Express
    • Sébastien Angèle
    • [email_address]
    • Jérôme Macias
    • [email_address]
  • Questions ?
    • Marc Weistroff
    • @futurecat
    • [email_address]
    • http://www.marcw.net
    • Emmanuel Cohen
    • @emmanuelcohen
    • [email_address]
  • Thank you! Please rate this talk at http://joind.in/2749