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

Otimizacao de aplicações Zend Framework

Embed Size (px)

DESCRIPTION

Palestra apresentada no CoderockrJam sobre otimizações de aplicativos Zend Framework

Citation preview

Page 1: Otimizacao de aplicações Zend Framework

Otimizando aplicações com Zend Framework

elton luís minetto@eminetto

segunda-feira, 8 de agosto de 11

Page 2: Otimizacao de aplicações Zend Framework

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

segunda-feira, 8 de agosto de 11

Page 3: Otimizacao de aplicações Zend Framework

Métricassegunda-feira, 8 de agosto de 11

Page 4: Otimizacao de aplicações Zend Framework

segunda-feira, 8 de agosto de 11

Page 5: Otimizacao de aplicações Zend Framework

segunda-feira, 8 de agosto de 11

Page 6: Otimizacao de aplicações Zend Framework

segunda-feira, 8 de agosto de 11

Page 7: Otimizacao de aplicações Zend Framework

segunda-feira, 8 de agosto de 11

Page 8: Otimizacao de aplicações Zend Framework

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

segunda-feira, 8 de agosto de 11

Page 9: Otimizacao de aplicações Zend Framework

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, 8 de agosto de 11

Page 10: Otimizacao de aplicações Zend Framework

Conceitos

• O que medir

•Transações por unidade de tempo

• Tempo de resposta ou latência

• Escalonamento

• Concorrência

segunda-feira, 8 de agosto de 11

Page 11: Otimizacao de aplicações Zend Framework

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, 8 de agosto de 11

Page 12: Otimizacao de aplicações Zend Framework

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, 8 de agosto de 11

Page 13: Otimizacao de aplicações Zend Framework

Criando o projetozf create project blog

• Criado um virtual host no apache<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>

• Adicionar no /etc/hosts: 127.0.0.1 blog.local

segunda-feira, 8 de agosto de 11

Page 14: Otimizacao de aplicações Zend Framework

O primeiro teste(sem APC)

• Transações por segundo: 51,55

segunda-feira, 8 de agosto de 11

Page 15: Otimizacao de aplicações Zend Framework

APC

• Transações por segundo: 110,94

segunda-feira, 8 de agosto de 11

Page 16: Otimizacao de aplicações Zend Framework

0

30

60

90

120

Sem APC Com APC

Transações/seg

segunda-feira, 8 de agosto de 11

Page 17: Otimizacao de aplicações Zend Framework

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, 8 de agosto de 11

Page 18: Otimizacao de aplicações Zend Framework

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, 8 de agosto de 11

Page 19: Otimizacao de aplicações Zend Framework

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, 8 de agosto de 11

Page 20: Otimizacao de aplicações Zend Framework

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, 8 de agosto de 11

Page 21: Otimizacao de aplicações Zend Framework

Banco de dados

• Transações por segundo: 85,25

segunda-feira, 8 de agosto de 11

Page 22: Otimizacao de aplicações Zend Framework

Banco de dados usando cache em disco

<?php

class 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, 8 de agosto de 11

Page 23: Otimizacao de aplicações Zend Framework

Banco de dados usando cache em disco

• Transações por segundo: 100,70

segunda-feira, 8 de agosto de 11

Page 24: Otimizacao de aplicações Zend Framework

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, 8 de agosto de 11

Page 25: Otimizacao de aplicações Zend Framework

Banco de dados usando cache em Memcache

• Transações por segundo: 102,85

segunda-feira, 8 de agosto de 11

Page 26: Otimizacao de aplicações Zend Framework

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, 8 de agosto de 11

Page 27: Otimizacao de aplicações Zend Framework

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, 8 de agosto de 11

Page 28: Otimizacao de aplicações Zend Framework

Cache do HTML

• Transações por segundo: 109,11

segunda-feira, 8 de agosto de 11

Page 29: Otimizacao de aplicações Zend Framework

0

27,5

55,0

82,5

110,0

BD Cache em Disco Cache em Memcache Cache de HTML

Transações/seg

segunda-feira, 8 de agosto de 11

Page 30: Otimizacao de aplicações Zend Framework

Inclusão em banco de dados

mysql -uroot -proot performance

create 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, 8 de agosto de 11

Page 31: Otimizacao de aplicações Zend Framework

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, 8 de agosto de 11

Page 32: Otimizacao de aplicações Zend Framework

Inclusão em banco de dados

• Transações por segundo: 108,45

segunda-feira, 8 de agosto de 11

Page 33: Otimizacao de aplicações Zend Framework

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, 8 de agosto de 11

Page 34: Otimizacao de aplicações Zend Framework

Inclusão em banco de dados - gearman

• Transações por segundo: 109,61

segunda-feira, 8 de agosto de 11

Page 35: Otimizacao de aplicações Zend Framework

108,0

108,5

109,0

109,5

110,0

Inclusão Gearman

Transações/seg

segunda-feira, 8 de agosto de 11

Page 36: Otimizacao de aplicações Zend Framework

NGINX

• Usar o Nginx para entregar o conteúdo estático (css/html/js) e redirecionar o restante para o Apache

• Transações por segundo: 106,83 (página inicial)

segunda-feira, 8 de agosto de 11

Page 38: Otimizacao de aplicações Zend Framework

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, 8 de agosto de 11