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

Otimizando aplicações Zend Framework - Tchelinux

Apr 22, 2015

Download

Technology

Elton Minetto

Apresentação sobre otimizações em aplicações Zend Framework. Apresentado no Tchelinux Bento Gonçalves
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
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