39
Otimizando aplicações com Zend Framework elton luís minetto @eminetto segunda-feira, 15 de agosto de 11

Otimizando aplicações Zend Framework - Tchelinux

Embed Size (px)

DESCRIPTION

Apresentação sobre otimizações em aplicações Zend Framework. Apresentado no Tchelinux Bento Gonçalves

Citation preview

Page 1: Otimizando aplicações Zend Framework - Tchelinux

Otimizando aplicações com Zend Framework

elton luís minetto@eminetto

segunda-feira, 15 de agosto de 11

Page 2: Otimizando aplicações Zend Framework - Tchelinux

Quem sou Eu?

Graduado e pós-graduado em Ciência da Computação

Trabalha com PHP/MySQL desde 2000. Trabalha com Linux desde 1997. Professor desde 2004.

Autor do livro Frameworks para Desenvolvimento em PHP - Editora Novatec, co-autor do livro Grid Computing in Research and Education - IBM Redbooks e autor do e-book Zend Framework na prática

Membro do PHPSC e sócio da Coderockr

segunda-feira, 15 de agosto de 11

Page 3: Otimizando aplicações Zend Framework - Tchelinux

Métricas

segunda-feira, 15 de agosto de 11

Page 4: Otimizando aplicações Zend Framework - Tchelinux

segunda-feira, 15 de agosto de 11

Page 5: Otimizando aplicações Zend Framework - Tchelinux

segunda-feira, 15 de agosto de 11

Page 6: Otimizando aplicações Zend Framework - Tchelinux

segunda-feira, 15 de agosto de 11

Page 7: Otimizando aplicações Zend Framework - Tchelinux

segunda-feira, 15 de agosto de 11

Page 8: Otimizando aplicações Zend Framework - Tchelinux

Conceitos

Avaliação de desempenho

“Quão bem isto executa?”

Determinar a capacidade de um sistema

Análise de desempenho

“Por que isso executa desta maneira?”

Determinar onde a aplicação gasta mais tempo e recurso

segunda-feira, 15 de agosto de 11

Page 9: Otimizando aplicações Zend Framework - Tchelinux

Conceitos

Avaliar a aplicação inteira (full-stack)

ab; siege; http_load; jMeter

ou somente um componente(single-component)

MySQL Benchmark Suite/innotop; (MySQL) ; Xdebug (PHP); ySlow(html+css+js)

segunda-feira, 15 de agosto de 11

Page 10: Otimizando aplicações Zend Framework - Tchelinux

Conceitos

O que medir

Transações por unidade de tempo

Tempo de resposta ou latência

Escalonamento

Concorrência

segunda-feira, 15 de agosto de 11

Page 11: Otimizando aplicações Zend Framework - Tchelinux

A máquina

Intel(R) Core(TM)2 Duo CPU E6550 @ 2.33GHz, 2GB RAM

Ubuntu Server; Apache 2.2.16; MySQL 5.1.49; PHP 5.3.3; Zend Framework 1.11.9

segunda-feira, 15 de agosto de 11

Page 12: Otimizando aplicações Zend Framework - Tchelinux

Ferramentas

siege

siege -c 100 -r 10 -d 1 http://URL

Observações:

Executado 3 vezes e gerada a média

A cada execução são reiniciados os serviços (apache, mysql, memcached, nginx, gearman)

segunda-feira, 15 de agosto de 11

Page 13: Otimizando aplicações Zend Framework - Tchelinux

Criando o projeto

Criado um virtual host no apache

Adicionar no /etc/hosts:

<VirtualHost *:80> ServerName blog.local DocumentRoot /var/www/blog/public

SetEnv APPLICATION_ENV "development"

<Directory /var/www/blog/public> DirectoryIndex index.php AllowOverride All Order allow,deny Allow from all </Directory></VirtualHost>

zf create project blog

127.0.0.1 blog.local

segunda-feira, 15 de agosto de 11

Page 14: Otimizando aplicações Zend Framework - Tchelinux

O primeiro teste(sem APC)

Transações por segundo: 51,55

segunda-feira, 15 de agosto de 11

Page 15: Otimizando aplicações Zend Framework - Tchelinux

APC

Transações por segundo: 110,94

segunda-feira, 15 de agosto de 11

Page 16: Otimizando aplicações Zend Framework - Tchelinux

0

30

60

90

120

Sem APC Com APC

Transações/seg

segunda-feira, 15 de agosto de 11

Page 17: Otimizando aplicações Zend Framework - Tchelinux

Banco de dados

mysql -uroot -prootcreate database performance;use performance;create table post (id int primary key auto_increment, title varchar(100), text text);exit;for ((i=1;i<100;i++)) ; do

mysql -uroot -proot performance -e "insert into post values (null, 'Titulo $i', 'Texto $i')"done

segunda-feira, 15 de agosto de 11

Page 18: Otimizando aplicações Zend Framework - Tchelinux

Banco de dados

zf configure dbadapter "adapter=Pdo_Mysql&host=localhost&username=root&password=root&dbname=performance"zf create db-table Post postzf create controller Post

segunda-feira, 15 de agosto de 11

Page 19: Otimizando aplicações Zend Framework - Tchelinux

Banco de dados

<?phpclass PostController extends Zend_Controller_Action{ public function indexAction() { $post = new Application_Model_DbTable_Post(); $this->view->entries = $post->fetchAll(); }}

segunda-feira, 15 de agosto de 11

Page 20: Otimizando aplicações Zend Framework - Tchelinux

Banco de dados

application/views/scripts/post/index.phtml

Posts: <br /><dl> <?php foreach ($this->entries as $entry): ?> <dt><?php echo $this->escape($entry->title) ?></dt> <dd><?php echo $this->escape($entry->text) ?></dd> <?php endforeach ?></dl>

segunda-feira, 15 de agosto de 11

Page 21: Otimizando aplicações Zend Framework - Tchelinux

Banco de dados

Transações por segundo: 85,25

segunda-feira, 15 de agosto de 11

Page 22: Otimizando aplicações Zend Framework - Tchelinux

Banco de dados usando cache em disco

<?phpclass PostController extends Zend_Controller_Action { public function indexAction() { $frontendOptions = array(

'lifetime' => 7200,'automatic_serialization' => true);

$backendOptions = array('cache_dir' => '/tmp/'); $cache = Zend_Cache::factory('Core','File',$frontendOptions,$backendOptions); if( ($result = $cache->load('posts')) === false ) { $post = new Application_Model_DbTable_Post(); $result = $post->fetchAll(); $cache->save($result,'posts'); } $this->view->entries = $result; }}

segunda-feira, 15 de agosto de 11

Page 23: Otimizando aplicações Zend Framework - Tchelinux

Banco de dados usando cache em disco

Transações por segundo: 100,70

segunda-feira, 15 de agosto de 11

Page 24: Otimizando aplicações Zend Framework - Tchelinux

Banco de dados usando cache em MEMCACHE

<?phpclass PostController extends Zend_Controller_Action { public function indexAction() { $frontendOptions = array('lifetime' => 7200, 'automatic_serialization' => true); $backendOptions = array('servers' => array( array('host' => 'localhost','port' => 11211,'persistent' => true) )); $cache = Zend_Cache::factory('Core', 'Memcached' , $frontendOptions ,$backendOptions); if( ($result = $cache->load('posts')) === false ) { $post = new Application_Model_DbTable_Post(); $result = $post->fetchAll(); $cache->save($result,'posts'); } $this->view->entries = $result; }}

segunda-feira, 15 de agosto de 11

Page 25: Otimizando aplicações Zend Framework - Tchelinux

Banco de dados usando cache em Memcache

Transações por segundo: 102,85

segunda-feira, 15 de agosto de 11

Page 26: Otimizando aplicações Zend Framework - Tchelinux

Cache do html

copiar views/scripts/post/index.phtml para views/scripts/post/_index.phtml

Alterar views/scripts/post/index.phtml para:

<?php echo $this->page; ?>

segunda-feira, 15 de agosto de 11

Page 27: Otimizando aplicações Zend Framework - Tchelinux

Cache do html

<?phpclass PostController extends Zend_Controller_Action { public function indexAction() { $frontendOptions = array('lifetime' => 7200, 'automatic_serialization' => true); $backendOptions = array('servers' => array( array('host' => 'localhost','port' => 11211,'persistent' => true))); $cache = Zend_Cache::factory('Core', 'Memcached' , $frontendOptions ,$backendOptions); if( ($page = $cache->load('posts_page')) === false ) { $post = new Application_Model_DbTable_Post(); $this->view->entries = $post->fetchAll(); $page = $this->view->render('post/_index.phtml'); $cache->save($page,'posts_page'); } $this->view->page = $page; }}

segunda-feira, 15 de agosto de 11

Page 28: Otimizando aplicações Zend Framework - Tchelinux

Cache do HTML

Transações por segundo: 109,11

segunda-feira, 15 de agosto de 11

Page 29: Otimizando aplicações Zend Framework - Tchelinux

0

27,5

55,0

82,5

110,0

BD Cache em Disco Cache em Memcache Cache de HTML

Transações/seg

segunda-feira, 15 de agosto de 11

Page 30: Otimizando aplicações Zend Framework - Tchelinux

Escalando

0

75

150

225

300

100 200 500 1000

Requisições por segundo/usuários simultâneos

Cache em disco Memcached

segunda-feira, 15 de agosto de 11

Page 31: Otimizando aplicações Zend Framework - Tchelinux

Inclusão em banco de dados

mysql -uroot -proot performancecreate table access (id int primary key auto_increment, page varchar(100), time timestamp default current_timestamp);exit;zf create db-table Access access

segunda-feira, 15 de agosto de 11

Page 32: Otimizando aplicações Zend Framework - Tchelinux

Inclusão em banco de dados

//novo método no PostControllerpublic function insertAction() { $access = new Application_Model_DbTable_Access(); $data = array('page'=>'/insert'); $access->insert($data); echo 'Inserido'; exit;}

segunda-feira, 15 de agosto de 11

Page 33: Otimizando aplicações Zend Framework - Tchelinux

Inclusão em banco de dados

Transações por segundo: 108,45

segunda-feira, 15 de agosto de 11

Page 34: Otimizando aplicações Zend Framework - Tchelinux

Inclusão em banco de dados - Gearman

//novo método no PostControllerpublic function insertAction() { $client= new GearmanClient(); $client->addServer(); $data = array('page'=>'/insert'); $client->doBackground("access_queue", serialize($data)); echo 'Inserido'; exit;}

segunda-feira, 15 de agosto de 11

Page 35: Otimizando aplicações Zend Framework - Tchelinux

Inclusão em banco de dados - gearman

Transações por segundo: 109,61

segunda-feira, 15 de agosto de 11

Page 36: Otimizando aplicações Zend Framework - Tchelinux

108,0

108,5

109,0

109,5

110,0

Inclusão Gearman

Transações/seg

segunda-feira, 15 de agosto de 11

Page 37: Otimizando aplicações Zend Framework - Tchelinux

Escalando

0

75

150

225

300

100 200 500 10000

Requisições por segundo/usuários simultâneos

Insert MySQL Gearman

segunda-feira, 15 de agosto de 11

Page 39: Otimizando aplicações Zend Framework - Tchelinux

Contato

<?php$card = array( 'nome' => 'Elton Luís Minetto', 'site' => 'http://www.eltonminetto.net', 'e-mail' => '[email protected]', 'twitter' => '@eminetto', 'all' => 'http://eminetto.me');var_dump($card);

segunda-feira, 15 de agosto de 11