marcos quesada caching_sf2

Download Marcos quesada caching_sf2

If you can't read please download the document

Upload: symfonybcn

Post on 16-Apr-2017

7.028 views

Category:

Technology


0 download

TRANSCRIPT

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 !!

[email protected]

@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