Marcos quesada caching_sf2
-
Upload
symfonybcn -
Category
Technology
-
view
7.030 -
download
0
Transcript of Marcos quesada caching_sf2
Caching en Symfony 2
Escalando aplicaciones web
Marcos Quesada@marcos_quesada
About me
Code enthusiast & More ;)
Symfony 2 desde agosto 2011
Symfony [email protected]
@marcos_quesada
es.linkedin.com/in/marcosquesada
Contenido de la presentacin
Introduccin
Cache Symfony 2
Varnish
Caching contenido esttico + CDN
Transient Data
Arquitectura de escalado
Conclusiones
Introduccin
Backend developer:donde almaceno los datosDatos: strings, arrays, objects, HTML
En dB / Static files . o en memoria!
Cuando pensamos en cacheexpiration&validation : PERFORMANCE
Piensa en cold start: cache Warmup & Low Hit Rates
Volumen datos Vs tiempo consumido
Performance
Cual va a ser nuestro volumen de pginas vistas totales?
Planificacin
OptimizacinThe fastest HTTP request is the one not made.
No resuelvas problemas que no tienes
Reduccin del contenido a entregar
Anlisis PageSpeed
Impacto directo con el coste de explotacin
http://slides.seld.be/?file=2011-10-20+High+Performance+Websites+with+Symfony2.html
http://danielmiessler.com/blog/10-ways-to-test-your-website-performance
-dump routes to apache
Metricas: localiza cuellos de botella
Monitoriza : Munin, Nagios ...
Profiling: XHProf
Pruebas de cargaJmeter , Apache Benchmark ,httperf
Identificando que cachear:Datos con alta demanda
Caros de generar
Grandes en tamao
Datos comunes
Trucos para encontrar datos cacheablesMonitor Queries
Output queries
Monitor Page Loads
Monitor Web Analytics
http://damithakumarage.wordpress.com/2009/03/15/benchmark-testing-with-httperf/
http://www.sirviejo.com/como-instalar-configurar-y-usar-xhprof/
http://blog.preinheimer.com/index.php?/archives/355-A-GUI-for-XHProf.html
Introduction to HTTP Caching
Reverse HTTP proxy, a veces llamdo HTTP accelerator o web accelerator
Cache-controlmax-age
stale_while_revalidate
stale_if_error
MetricasCache hit Vs Cache miss
analizando headers: curl -so /dev/null -D - http://www.playgroundmag.net/musica
GET -Used http://www. (trae Header completo)
Introduction to HTTP Caching
Analizando Headers
Analizando Headers
Symfony 2 cache
Symfony 2 es un framework con cache propia
Qu cache?
Definicin de cache:"A cache is a collection of data duplicating original values stored elsewhere or computed earlier, where the original data is expensive to fetch or to compute, compared to the cost of reading the cache." (Wikipedia)
Que tipo de cache ?Carpeta Cache ?
APC ?
Reverse Proxy Cache ?
Symfony 2 cache folder
Generacin de 'cache' desactivable comentando $kernel->loadClassCache
Symfony 2 cache PROD
Symfony 2 cache
Symfony2 incluye un reverse proxy escrito en PHP.
Otras denominaciones: Gateway caches ,reverse proxy caches, surrogate caches, delegado inverso o HTTP accelerators.
El sistema de cache de Symfony2 est basado en la potencia y simplicidad del caching HTTP como define su normativa RFC 2616
http://symfony.com/doc/current/book/http_cache.html
Step 1: A gateway cache, or reverse proxy, is an independent layer that sits in front of your application. The reverse proxy caches responses as they're returned from your application and answers requests with cached responses before they hit your application. Symfony2 provides its own reverse proxy, but any reverse proxy can be used.Step 2: HTTP cache headers are used to communicate with the gateway cache and any other caches between your application and the client. Symfony2 provides sensible defaults and a powerful interface for interacting with the cache headers.Step 3: HTTP expiration and validation are the two models used for determining whether cached content is fresh (can be reused from the cache) or stale (should be regenerated by the application).Step 4: Edge Side Includes (ESI) allow HTTP cache to be used to cache page fragments (even nested fragments) independently. With ESI, you can even cache an entire page for 60 minutes, but an embedded sidebar for only 5 minutes.
Symfony 2 cache : headers
Symfony 2 cache: contents
Enabling AppCache
http://gitnacho.github.com/symfony-docs-es/book/http_cache.html
HttpFoundation Component
Object Oriented wrapper Server Globals Variables
Symfony\Component\HttpFoundation\ResponseColeccin de mtodos para manipular las cabeceras HTTP del Objeto Response
http://gitnacho.github.com/symfony-docs-es/components/http_foundation.html
AppCache default setings
Setting Response HTTP headers
Using Validation
http://www.slideshare.net/odino/be-lazy-be-esi-http-caching-and-symfony2-phpday-2011
PURGE
La implementacin del PURGE puede romper la compatibilidad con otros Reverse Proxy Caches
Nunca debera ser necesario invalidar los datos almacenados en cach porque la invalidacin ya se tiene en cuenta de forma nativa en los modelos de cach HTTP
Proteger el mtodo PURGE de HTTP : restringe el acceso
https://mail.google.com/mail/?ui=2&view=btop&ver=18zqbez0n5t35&cat=Projects%2FPresentacion%2FCache&search=cat&th=1354a9942abe523f&cvid=2
http://symfony.com/doc/current/book/http_cache.html#http-cache-invalidation
Ventajas & Problemas
Truco debugar cache : error_log($kernel->getLog());
Cache:clear & cache:warmupClear sin fin
Imposible borrar app/cache
Multiples regeneraciones de cache en paralelo
stale_if_error
Deploys en produccin complicados si hay mucho trficoCorte programado / Restriccin de acceso
Alternativa: apc.stat = 0 , Pull & Clear Opcode cache
Purge total o parcial complicado
ESI
Habilita ESI , setea secciones como standalone Esto permite varios TTLs en una misma pgina
Setea shared max age en responses y sectionsSi se fija un max age como non-shared,toda la pgina queda cacheada, ESI no funcionar:
$response->setSharedMaxAge(60)
ESI
Renders: symfony2 will create a subrequest for you, call the widget and include the subresponse in your masterresponse.{% render 'MyBundle:Controller:widgetaction' {'param1':'foo'} %}
Having every (sub)action represented as a request makes ESI {% render 'MyBundle:Controller:widgetaction' {'param1':'foo'} with {'standalone':true} %}
https://www.varnish-cache.org/docs/trunk/tutorial/esi.html
Sub Request en renders (widgets)..., ESI http://100days.de/serendipity/archives/150-wetter.com-Relaunch-with-symfony2,-Assetic,-Varnish-and-Twig.html
ESI
http://www.slideshare.net/fabpot/caching-on-the-edge-with-symfony2 P 29
ESI
app/config/config.ymlframework: esi: { enabled: true }
{% render 'FooBundle:Bar:index' with {}, {'standalone': true} %}
Aadir la ruta (debe estar securizada) # app/config/routing.yml_internal: resource: "@FrameworkBundle/Resources/config/routing/internal.xml" prefix: /_internal
Cuando standalone es false (predeterminado), Symfony2 combina el contenido de la pgina incluida en la principal antes de enviar la respuesta al cliente. Pero cuando standalone es true, y si Symfony2 detecta que est hablando con una pasarela cach compatible con ESI, genera una etiqueta include ESI. Pero si no hay una pasarela cach o si no es compatible con ESI, Symfony2 termina fusionando el contenido de las pginas incluidas en la principal como lo habra hecho si standalone se hubiera establecido en false.
Problemas
Debuggar ESI se vuelve complicado!
Enabling debugging with:
$framework = new HttpCache($framework, new Store(__DIR__.'/../cache'), new ESI(), array('debug' => true)); The debug mode adds a X-Symfony-Cache header to each response that describes what the cache layer did:
X-Symfony-Cache: GET /is_leap_year/2012: stale, invalid, store X-Symfony-Cache: GET /is_leap_year/2012: fresh
http://fabien.potencier.org/article/59/create-your-own-framework-on-top-of-the-symfony2-components-part-10
Varnish
Reverse Proxy Cache
Escrito on C
Soporta ESI
Muy flexible y configurable (Varnish Configuration Language)
Almacena todo su contenido sobre la RAM: muy rpido
Muy altas prestaciones: Consumo de CPU relativamente bajo
Varnish puede consumir toda la RAM que le pongas,asegrate que configuras su max memory (por debajo de la RAM disponible)
Basicshttp://www.ibm.com/developerworks/opensource/library/os-php-varnish/
http://kristianlyng.wordpress.com/2010/01/13/pushing-varnish-even-further/Varnish - CPU Vs Memory- low cache hit rate
What you can learn from this is actually simple: Do not focus on the CPU when you want to scale your Varnish setup. I know its tempting to buy the biggest baddest server around for a high-traffic site, but if your active data set can fit within physical memory and you have a 64-bit CPU, Varnish will thrive. And for the record: All CPU-usage graphs Ive seen from Varnish installations confirm this. Most of the time, those sexy CPUs are just sitting idle regardless of traffic.
About running all data set on mem & sync to disk as a rescueAn otherimportant detail is that your shmlog shouldnt trigger disk activity. On my setup, it didnt sync to disk to begin with, but you may want to stick it on a tmpfs just to be sure. I suspect this has improved throughout the 2.0-series of Varnish, but its an easy insurance. Typically the shmlog is found in /usr/var/varnish, /usr/local/var/varnish or similar (ls /proc/*/fd | grep _.vsl is the lazy way to find it).
Varnish
Varnish puede trabajar como Balanceador de CargaConfigurado contra multiples backends
Realiza Health-Checks en los web Servers
Nmero de Threads: Varnish puede crear nuevos threads bajo demanda, y eliminarlos cuando la carga total se reduce
Es perfecto para picos de trfico
Una buena aproximacin es mantener unos pocos threads idle durante el trfico regular, anticipando el incremento de trfico en lugar de levantar y destruir otros segn cambia la demanda
En sistemas de 64-bit , el coste de tener unos cientos de threads extras es muy limitado
Varnish Configuration Language
Configura cada request
Define:Backends (web servers)
ACLs
Load balancing strategy
Can be reloaded while running
Tell Varnish to communicate with the content server (Nginx) on port 8080.backend default { .host = "127.0.0.1"; .port = "8080";}
Unsetting Cookies:sub vcl_recv { unset req.http.cookie;}sub vcl_fetch { unset beresp.http.set-cookie;}
Varnish
Varnish- what can/cant't be cached?Can:
Static Pages Images,js,css Static parts of pages that don't change often(ESI)Can't
POST request Very large files Request with Set-Cookie !!!! User-specific content
Real-time statistics Varnishtop
varnishtop
This command shows the most often-made requests to the backend:
varnishtop -b -i TxURLIts excellent for spotting often-requested items that are currently not being cached. The -b flag filters for requests made to the backend. -i TxURL filters for the request URL that triggered the request to the backend. Its output looks something like this:
Real-time statistics Varnishtop
varnishtop -b -i TxURL-b flag filters for requests made to the backend.
-i TxURL filters for the request URL that triggered the request to the backend.
http://blogs.osuosl.org/gchaix/2009/10/12/pressflow-varnish-and-caching/
Real-time statistics : Varnishhist
Varnishhist shows a histogram for the past 1000 requests
http://blogs.osuosl.org/gchaix/2009/10/12/pressflow-varnish-and-caching/
Real-time statistics: varnishlog
varnishlog -c -o ReqStart displays all varnish traffic for a specific client. Its helpful for seeing exactly what a particular page or request is doing.
This command displays all varnish traffic for a specific client. Its helpful for seeing exactly what a particular page or request is doing. Set it to your workstation IP, load the page, see everything Varnish does with your connection including hit/miss/pass status. Varnishlog is really useful, but it puts out an overwhelmingly-large amount of data that isnt easily filtered. The -o option groups all of the entries for a specific request together (without it all entries from all requests are displayed fifo) and it accepts a tag (ReqStart in this example) and regex (the IP address in this case) to filter for only requests associated with that tag & regex. Its the only way Ive found to filter down the firehose of log entries into something useful.
Real-time statistics :Varnishstat
Varnishstat is the tool used to monitor the basic health of Varnish. Unlike all the other tools, it doesnt read log entries, but counters that Varnish update in real-time. It can be used to determine your request rate, memory usage,thread usage, and just about anything thats not related to a specific request. This command provides an overview of the stats for the current Varnish instance. It shows hit/miss/pass rates and ratios, lots of other gory internal details.
http://kristianlyng.wordpress.com/2009/12/08/varnishstat-for-dummies/
http://blogs.osuosl.org/gchaix/2009/10/12/pressflow-varnish-and-caching/
PURGE en Varnish
Varnish se puede configurar para aceptar un mtodo HTTP especial PURGE que invalida la cach para un determinado recurso:
acl purge { "localhost"; "192.168.0.0/24";}
sub vcl_recv { if (req.request == "PURGE") { if (!client.ip ~ purge) { error 405 "Not allowed."; } return (lookup); }}
sub vcl_hit { if (req.request == "PURGE") { set obj.ttl = 0s; error 200 "Purged."; }}
sub vcl_miss { if (req.request == "PURGE") { error 404 "Not purged"; }}
http://gitnacho.github.com/symfony-docs-es/cookbook/cache/varnish.html
ESI on Varnish
# /etc/varnish/default.vclbackend default { .host = "127.0.0.1"; .port = "80";}
sub vcl_recv { set req.backend = default; # Tell Symfony2 that varnish is there, supporting ESI set req.http.Surrogate-Capability = "abc=ESI/1.0";}
sub vcl_fetch { # Enable ESI only if the backend responds with an ESI header if (beresp.http.Surrogate-Control ~ "ESI/1.0") { unset beresp.http.Surrogate-Control; // for Varnish >= 3.0 set beresp.do_esi = true; // for Varnish < 3.0 // esi; }}
http://slides.seld.be/?file=2011-10-20+High+Performance+Websites+with+Symfony2.html#60
http://symfony.com/doc/current/cookbook/cache/varnish.html
Varnish : problemas
Busca un setup estable: The system worked great for a while, and then took a nosedive as the Varnish cache ate up all the available RAM and pushed the system into a swap death spiral.
Cuidado con low hit rate (Usa ESI)
Riesgos de purgado
Cookies & sessions : planifica tu estrategia
We did not want to use PHP sessions in this project as that would have been a major performance drawback. What we did instead: We implemented client side signed cookies as a C plugin in varnish (more about that in a separate post somewhen later). This way, varnish can cache the content for different user levels and distinguish between them without the need to invoke PHP
Browser Cache
Using ExpirationLast-Modified & is-modified-since response header
Browser Cache
Using Etag: If-None-Match request
CDN
Akamai:world's largest CDN serves about 20% of the web traffic using over 100,000 servers located in over 1000 networks and over 70 countries
Amazon S3 + CloudFront
Ahorro de ancho de banda
CDN
Enabling CDN on assets
External tools: S3cmd:s3cmd sync /var/www/symfony/web/images/ s3://cdn-image01 --acl-public
Zend Library S3
Associated path Twig Extension
framework: secret: s3cr3t templating: assets_base_urls: https://cdn.example.com engines: { engines: ['twig'], assets_version: v1 } packages: images: base_urls: https://images.example.com
$assets=new AssetCollection( array( new FileAsset(web/Bundle/style.css), new GlobAsset(web/*.css),));$assets->load();
$writer=newAssetWriter(s3://bucket);$writer->writeManagerAssets($assets);
Transient Data
Key => ValueAPC
Memcached
Redis ...
La base de datos suele ser siempre el mayor cuello de botella de performance en backend
Una capa de caching sobre la base de datos resuelve de gran manera los problemas de performance y escalabilidad
APC: PHP compilation
PHP Compilation -scanning / lexing: plain text code turned in tokens -parsing: tokens are collected into Expressions -compilation: Expressions are translated into Opcodes for execution -execution: Opcode stacks are processed, one at a time.APC caches the Opcodes for later execution
APC performance
APC.stat performance
APC.php
Conclusinhttp://engineering.emagister.com/2011/10/20/performance-tricks-para-apc/
Hay cosas que cuestan tan poco
1. Aumentar el espacio de memoria para que el Cache full count sea 0.
2. Utilizad igbinary para acelerar el procese de serializacin y deserializacin (a parte lo podris utilizar en cdigo normal con igbinary_serialize y igbinary_unserialize, con sistemas de colas, por ejemplo).
3. Setead apc.stat a 0 en produccin y forzar un reload o un flush del apc despus de que algn fichero cambie (con una subida, por ejemplo)
Material extra
http://prezi.com/re8rsdjmpkko/oscon-09-high-performance-apc/
http://www.slideshare.net/vortexau/improving-php-application-performance-with-apc-presentation
http://www.php.net/manual/en/apc.configuration.php
http://talks.php.net/show/froscon08
http://phpolyk.wordpress.com/2011/08/28/igbinary-the-new-php-serializer/
APC tweaking
se recomienda: apc.stat=1 en desarrollo. Devolver a 0 en produccin.
apc.shm_size: cunta memoria va a ser asignada a APCComo regla general,apc.shm_size debe ser el doble de la mxima memoria utilizada por APCs para evitar por completo la fragmentacin
Vigilar Full Count: Se purga por quedarse sin espacio, si sube de 0 es probable que surjan errores 500!
apc.user_ttl = 0: Sin limite TTL
Ejemplo configuracin en php.ini:
extension=/usr/lib/php5/20090626/apc.soapc.enabled = 1apc.shm_size = 100M apc.ttl = 0apc.user_ttl = 0apc.gc_ttl = 600apc.stat = 1
https://mail.google.com/mail/#label/Projects/Presentacion/Cache/135644211c052a11
Simple API to store PHP variables on APC
Symfony 2 apc autoload
UniversalClassLoader:the loader iterates over all configured namespaces to find a particular file, making file_exists calls until it finally finds the file it's looking for.
ApcUniversalClassLoader( namespace )Solution:cache on APC the location of each class after it's located the first time.
When using the APC autoloader, if you add new classes, they will be found automatically and everything will work the same as before (i.e. no reason to "clear" the cache). However, if you change the location of a particular namespace or prefix, you'll need to flush your APC cache. Otherwise, the autoloader will still be looking at the old location for all classes inside that namespace.
Memcached
Sistema distribuido de cacheo de objetos en memoria
Tecnicamente es un server
Client access sobre TCP or UDP: Fast asynchronous network I/O
Sistema escalable a multiples servers en forma de pools
Servers are independent, managed by clients
No redundacy or fail over! It's a cache!
No replication , no authentication
No enumeration of keys
Sin mecanismo de clean-up
No tiene persistencia
Memcached
Offers built-in session handler
Giant Hash table or Array
Flujo:Pool Memcached Servers
Assign values to keys that are stored in cluster
The client hashes the key to a particular machine in the cluster
Subsequent request for that key retrtive the value from the memcachedserver on wich it was stored
Values time out after the specified TTL
Limites:Key max 250 chars
Values Up to 1MB
Improving Memcached
Serialization Si se usa memcached para almacenar datos complejos (array&objects), necesitan ser serializados en strings
Consume recursos
Puede ser mejorado con igbinary 30% mas rpido
Produce datos mas compactos hasta 45% menores con respecto al serializador nativo PHP
http://github.com/phadej/igbinary
Distributed memcached
Memcached: OO API
Memcached
app/config/config.yml
acme_memcached: servers: server1: host: 192.168.1.1 port: 11211 weight: 25 server2: Host:192.168.1.2 port: 11211 Weight: 75server3: host: 192.168.1.3 port: 11211 weight: 50
Memcached
class AcmeMemcachedExtension extends Extension { public function load(array $configs, ContainerBuilder $container) { $configuration = new Configuration(); $config = $this->processConfiguration($configuration, $configs); $container->setParameter('acme_memcached.servers', $config['servers']); unset($config['servers']); $loader = new Loader\XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config')); $loader->load('services.xml'); } }
Access to memcached Service:
$memcachedSvc = $this->container->get('memcached.service.pool');
//sets key=> value, with no compression & no expiration$memcachedSvc->set('hask_key',$dataValue, false, 0);
$data = $memcachedSvc->get('hash_key');
Service Definition
http://blog.logicexception.com/2011/10/integrating-memcached-with-symfony2.html
Memcached : GUI phpMemcachedAdmin
http://code.google.com/p/phpmemcacheadmin/
Memcached GUI
APC Vs Memcached
Aparte del Opcode, Cuando debemos usar APC ? Cuando los datos no sean distribuidos (nico server)
Op Code + User cache ambos en APC == all eggs in one basket
Requests garantizados a una misma sesin ( sticly sessions)
file upload progress&sessions ( sticky sessions)
Es un componente PHP
Typical uses:Application settings
Almacenar configuraciones
Caching de datos (db)
Data comunes para los usuarios
APC Vs Memcached
Cuando debemos usar memcached?Cuando no est garantizado que las request vayan a una misma mquina
Datos especficos dirigidos al usuario
user sessions (Memcached Session Handler)
Habla diferentes lenguajes : PHP, Python, Ruby ,Java,Perl ...
Las instancias pueden ser compartidas en mltiples servers del pool
MAS LENTO APC, especialmente en array storage
Caching on Doctrine
Doctrine cache drivers:Apc , memcache, Xcache
useResultCache & useQueryCache
http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/
http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/caching.html
Cache de DQL$config->setMetadataCacheImpl(newDoctrine\Common\Cache\ApcCache());Cache de resultados$config->setQueryCacheImpl(newDoctrine\Common\Cache\ApcCache());
Caching on Doctrine
QueryBuilder cache que almacena la transformada SQL de la query DQL
Usando APC:
http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/
http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/caching.html
Cache de DQL$config->setMetadataCacheImpl(newDoctrine\Common\Cache\ApcCache());Cache de resultados$config->setQueryCacheImpl(newDoctrine\Common\Cache\ApcCache());
Arquitectura de escalado
Arquitectura de escalado
Colas & Logs
Operaciones asncronasEmails, generacin thumbs, procesos pesados
RabbitMQ
Beanstalk
Amazon SQS
Logs: Redis
MongoDb...
Nginx
Stack alternativo a ApachePHP-FPM
Soporte nativo de Memcached
Nginx maneja los rquest con una aproximacin asynchronous event-driven Le hace mas predecible en tiempo de respuesta Vs Apache
Alto rendimiento, consumo de memoria ptimo
Reload Gracely
Reverse Proxy Cache
Soporta ESI , aunque no es compatible al 100%
Escala muy bien , menos configurable que Varnish
http://todsul.com/install-configure-nginx
http://todsul.com/install-configure-php-fpm
Varnish Vs Nginx
Usa Nginx donde no se utilizan las plenas capacidades de Varnish (ESI principalmente)
Si necesitas servir contenidos estticos lo mas rpido posible, usa Nginx como frontal
Si necesitas servir contenido dinmico con ESI , usa Varnish
Si usas CDN para contenido esttico , la potencia de Nginx se vuelve menos relevante
Por tantoNginx es claramente mas rpido que Varnish
Usamos Varnish por ESI
Conclusiones
Php 5.3 Vs php 5.4 :benchmarks & page-load 10-30% mas rpido.
Intercambia Apache por Nginx
Estudia tus necesidades para buscar tu configuracin idealSoluciones Javascript (no bloqueantes) & Ajax
ESI te ayuda en Low Hit Caching rate (HTTP)
Soluciones de microcaching pueden ser suficientes
Ciclo de crecimientoMide Mejora vuelve a medir
Stress Test
Planifica tu deploy y tus subidas de cdigo
Implementa mecanismos de Warmup
Usa tiempos de cache lo mas largo posible
Gracias !!
@marcos_quesada
es.linkedin.com/in/marcosquesada
Enlaces de inters
Caching on the Edge Fabian Potencier : http://www.slideshare.net/fabpot/caching-on-the-edge-with-symfony2
HTTP Cache: http://symfony.com/doc/current/book/http_cache.html
Symfony 2 API: Symfony\Component\HttpFoundation\Response: http://api.symfony.com/2.0/
Invalidating cache: http://symfony.com/doc/current/book/http_cache.html#http-cache-invalidation
httperf: http://www.hpl.hp.com/research/linux/httperf/ benchmarking with httperf: http://damithakumarage.wordpress.com/2009/03/15/benchmark-testing-with-httperf/
Varnish Basics: http://symfony.com/doc/current/cookbook/cache/varnish.html
Configuring varnish: http://todsul.com/install-configure-varnish
VarnishStat form Dummies: http://kristianlyng.wordpress.com/2009/12/08/varnishstat-for-dummies/
Pushing Varnish event further: http://kristianlyng.wordpress.com/2010/01/13/pushing-varnish-even-further/
Enabling APC on autoloader: http://symfony.com/doc/current/book/performance.html
Memcached Debugging phpmemcachedadmin : http://www.kutukupret.com/2011/06/13/monitoring-and-debugging-memcached-server-using-phpmemcachedadmin/
Memcached phpMemcacheAdmin: http://code.google.com/p/phpmemcacheadmin/
Caching on Doctrine : http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/caching.html
Infrastucture at 99 designs: http://99designs.com/tech-blog/blog/2012/01/30/infrastructure-at-99designs/
wetter.com - Relaunch with symfony2, Assetic, Varnish and Twig http://100days.de/serendipity/archives/150-wetter.com-Relaunch-with-symfony2,-Assetic,-Varnish-and-Twig.html Amazon Guidelines: http://www.amazon.com/Amazon-Web-Services/e/B007R6MVQ6
Muokkaa otsikon tekstimuotoa napsauttamalla
Muokkaa jsennyksen tekstimuotoa napsauttamallaToinen jsennystasoKolmas jsennystasoNeljs jsennystasoViides jsennystasoKuudes jsennystasoSeitsems jsennystasoKahdeksas jsennystasoYhdekss jsennystaso