Slide 1

Slide 1 text

Otimizando aplicações com Zend Framework elton luís minetto @eminetto

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

Métricas

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

No content

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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)

Slide 10

Slide 10 text

Conceitos • O que medir • Transações por unidade de tempo • Tempo de resposta ou latência • Escalonamento • Concorrência

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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)

Slide 13

Slide 13 text

Criando o projeto • Criado um virtual host no apache • Adicionar no /etc/hosts: ServerName blog.local DocumentRoot /var/www/blog/public SetEnv APPLICATION_ENV "development" DirectoryIndex index.php AllowOverride All Order allow,deny Allow from all zf create project blog 127.0.0.1 blog.local

Slide 14

Slide 14 text

O primeiro teste (sem APC) • Transações por segundo: 51,55

Slide 15

Slide 15 text

APC • Transações por segundo: 110,94

Slide 16

Slide 16 text

0 30 60 90 120 Sem APC Com APC Transações/seg

Slide 17

Slide 17 text

Banco de dados mysql -uroot -proot create 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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

Banco de dados view->entries = $post->fetchAll(); } }

Slide 20

Slide 20 text

Banco de dados application/views/scripts/post/index.phtml Posts:
entries as $entry): ?>
escape($entry->title) ?>
escape($entry->text) ?>

Slide 21

Slide 21 text

Banco de dados • Transações por segundo: 85,25

Slide 22

Slide 22 text

Banco de dados usando cache em disco 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; }

Slide 23

Slide 23 text

Banco de dados usando cache em disco • Transações por segundo: 100,70

Slide 24

Slide 24 text

Banco de dados usando cache em Memcached 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; } }

Slide 25

Slide 25 text

Banco de dados usando cache em Memcache • Transações por segundo: 102,85

Slide 26

Slide 26 text

Cache do html copiar views/scripts/post/index.phtml para views/scripts/post/_index.phtml Alterar views/scripts/post/index.phtml para: page; ?>

Slide 27

Slide 27 text

Cache do html 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; } }

Slide 28

Slide 28 text

Cache do HTML • Transações por segundo: 109,11

Slide 29

Slide 29 text

0 27,5 55,0 82,5 110,0 BD Cache em Disco Cache em Memcache Cache de HTML Transações/seg

Slide 30

Slide 30 text

Escalando 0 75 150 225 300 100 200 500 1000 Requisições por segundo/usuários simultâneos Cache em disco Memcached

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

Inclusão em banco de dados / /novo método no PostController public function insertAction() { $access = new Application_Model_DbTable_Access(); $data = array('page'=>'/insert'); $access->insert($data); echo 'Inserido'; exit; }

Slide 33

Slide 33 text

Inclusão em banco de dados • Transações por segundo: 108,45

Slide 34

Slide 34 text

Inclusão em banco de dados - Gearman public function insertAction() { $client= new GearmanClient(); $client->addServer(); $data = array('page'=>'/insert'); $client->doBackground("access_queue", serialize($data)); echo 'Inserido'; exit; }

Slide 35

Slide 35 text

Inclusão em banco de dados - gearman • Transações por segundo: 109,61

Slide 36

Slide 36 text

108,0 108,5 109,0 109,5 110,0 Inclusão Gearman Transações/seg

Slide 37

Slide 37 text

Escalando 0 75 150 225 300 100 200 500 10000 Requisições por segundo/usuários simultâneos Insert MySQL Gearman

Slide 38

Slide 38 text

Referências • http://framework.zend.com • http://talks.php.net/show/oscon06 • http://talks.php.net/show/digg/ • http://vimeo.com/20387525 • http://vimeo.com/20565041 • http://www.slideshare.net/eminetto/ao-infinito-e-alm-com-php-memcached-e-gearman • http://www.slideshare.net/eminetto/desenvolvendo-aplicaes-web-escalveis-com-php

Slide 39

Slide 39 text

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