SlideShare una empresa de Scribd logo
1 de 38
Descargar para leer sin conexión
Otimizando aplicações com Zend Framework

                                   elton luís minetto
                                      @eminetto



segunda-feira, 8 de agosto de 11
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
Métricas
segunda-feira, 8 de agosto de 11
segunda-feira, 8 de agosto de 11
segunda-feira, 8 de agosto de 11
segunda-feira, 8 de agosto de 11
segunda-feira, 8 de agosto de 11
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
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
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
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
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
Criando o projeto
                         zf 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
O primeiro teste
                                     (sem APC)


                     • Transações por segundo: 51,55



segunda-feira, 8 de agosto de 11
APC


                     • Transações por segundo: 110,94



segunda-feira, 8 de agosto de 11
120




                        90




                        60




                        30




                         0
                                   Sem APC                    Com APC




                                             Transações/seg




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




segunda-feira, 8 de agosto de 11
Banco de dados

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




segunda-feira, 8 de agosto de 11
Banco de dados
                             <?php
                             class 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
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
Banco de dados


                     • Transações por segundo: 85,25



segunda-feira, 8 de agosto de 11
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
Banco de dados usando
                     cache em disco


                     • Transações por segundo: 100,70



segunda-feira, 8 de agosto de 11
Banco de dados usando
                  cache em MEMCACHE
                <?php
                class 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
Banco de dados usando
                   cache em Memcache


                     • Transações por segundo: 102,85



segunda-feira, 8 de agosto de 11
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
Cache do html
                             <?php
                             class 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
Cache do HTML


                     • Transações por segundo: 109,11



segunda-feira, 8 de agosto de 11
110,0




                       82,5




                       55,0




                       27,5




                          0
                                   BD   Cache em Disco           Cache em Memcache   Cache de HTML




                                                    Transações/seg




segunda-feira, 8 de agosto de 11
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
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;
                             }




segunda-feira, 8 de agosto de 11
Inclusão em banco de
                                dados


                     • Transações por segundo: 108,45



segunda-feira, 8 de agosto de 11
Inclusão em banco de
                          dados - Gearman
                             //novo método no PostController
                             public 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
Inclusão em banco de
                           dados - gearman


                     • Transações por segundo: 109,61



segunda-feira, 8 de agosto de 11
110,0




                    109,5




                    109,0




                    108,5




                    108,0
                                   Inclusão                    Gearman




                                              Transações/seg




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




segunda-feira, 8 de agosto de 11
contato

                             <?php
                             $card = array(
                                ‘nome’ => ‘Elton Luís Minetto’,
                                ‘site’ => ‘http://www.eltonminetto.net’,
                                ‘e-mail’ => ‘eminetto@coderockr.com’,
                                ‘twitter’ => ‘@eminetto’,
                                ‘all’ => ‘http://eminetto.me’
                             );
                             var_dump($card);
                             ?>




segunda-feira, 8 de agosto de 11

Más contenido relacionado

La actualidad más candente

(DevOps) Gerencia de Configuração, Puppet, Ansible e Chef uma Analise Compara...
(DevOps) Gerencia de Configuração, Puppet, Ansible e Chef uma Analise Compara...(DevOps) Gerencia de Configuração, Puppet, Ansible e Chef uma Analise Compara...
(DevOps) Gerencia de Configuração, Puppet, Ansible e Chef uma Analise Compara...Samuel Sampaio
 
Testes em aplicações JEE: Montando sua infra de testes automatizados
Testes em aplicações JEE: Montando sua infra de testes automatizadosTestes em aplicações JEE: Montando sua infra de testes automatizados
Testes em aplicações JEE: Montando sua infra de testes automatizadosDiego Santos
 
API de segurança do Java EE 8
API de segurança do Java EE 8API de segurança do Java EE 8
API de segurança do Java EE 8Helder da Rocha
 
Gerenciamento de Configurações - Puppet
Gerenciamento de Configurações - PuppetGerenciamento de Configurações - Puppet
Gerenciamento de Configurações - PuppetRoberto Scudeller
 
Gerenciamento de configuração com puppet
Gerenciamento de configuração com puppetGerenciamento de configuração com puppet
Gerenciamento de configuração com puppetElton Simões
 
Oficina Puppet - Aprenda a Gerenciar Configurações
Oficina Puppet - Aprenda a Gerenciar ConfiguraçõesOficina Puppet - Aprenda a Gerenciar Configurações
Oficina Puppet - Aprenda a Gerenciar ConfiguraçõesJose Augusto Carvalho
 
55 New Things in Java 7 - Brazil
55 New Things in Java 7 - Brazil55 New Things in Java 7 - Brazil
55 New Things in Java 7 - BrazilStephen Chin
 
Desenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmDesenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmGuilherme Blanco
 
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)Helder da Rocha
 
ZEO/RelStorage/PostgreSQL
ZEO/RelStorage/PostgreSQLZEO/RelStorage/PostgreSQL
ZEO/RelStorage/PostgreSQLgsroma
 
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)Carlos Duarte do Nascimento
 
Minicurso de Segurança em Java EE 7
Minicurso de Segurança em Java EE 7Minicurso de Segurança em Java EE 7
Minicurso de Segurança em Java EE 7Helder da Rocha
 
Coisas que aprendi e quero passar adiante - RubyConf Brasil 2010
Coisas que aprendi e quero passar adiante - RubyConf Brasil 2010Coisas que aprendi e quero passar adiante - RubyConf Brasil 2010
Coisas que aprendi e quero passar adiante - RubyConf Brasil 2010lucashungaro
 
Abstração do banco de dados com PHP Doctrine
Abstração do banco de dados com PHP DoctrineAbstração do banco de dados com PHP Doctrine
Abstração do banco de dados com PHP DoctrineOtávio Calaça Xavier
 
How to use Elasticsearch Analyzers by EmergiNet
How to use  Elasticsearch Analyzers by EmergiNetHow to use  Elasticsearch Analyzers by EmergiNet
How to use Elasticsearch Analyzers by EmergiNetEmergiNet
 

La actualidad más candente (20)

(DevOps) Gerencia de Configuração, Puppet, Ansible e Chef uma Analise Compara...
(DevOps) Gerencia de Configuração, Puppet, Ansible e Chef uma Analise Compara...(DevOps) Gerencia de Configuração, Puppet, Ansible e Chef uma Analise Compara...
(DevOps) Gerencia de Configuração, Puppet, Ansible e Chef uma Analise Compara...
 
Testes em aplicações JEE: Montando sua infra de testes automatizados
Testes em aplicações JEE: Montando sua infra de testes automatizadosTestes em aplicações JEE: Montando sua infra de testes automatizados
Testes em aplicações JEE: Montando sua infra de testes automatizados
 
API de segurança do Java EE 8
API de segurança do Java EE 8API de segurança do Java EE 8
API de segurança do Java EE 8
 
Gerenciamento de Configurações - Puppet
Gerenciamento de Configurações - PuppetGerenciamento de Configurações - Puppet
Gerenciamento de Configurações - Puppet
 
Aula JPA
Aula JPAAula JPA
Aula JPA
 
Gerenciamento de configuração com puppet
Gerenciamento de configuração com puppetGerenciamento de configuração com puppet
Gerenciamento de configuração com puppet
 
Oficina Puppet - Aprenda a Gerenciar Configurações
Oficina Puppet - Aprenda a Gerenciar ConfiguraçõesOficina Puppet - Aprenda a Gerenciar Configurações
Oficina Puppet - Aprenda a Gerenciar Configurações
 
55 New Things in Java 7 - Brazil
55 New Things in Java 7 - Brazil55 New Things in Java 7 - Brazil
55 New Things in Java 7 - Brazil
 
Desenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmDesenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine Orm
 
Java 08
Java 08Java 08
Java 08
 
Java 9, 10, 11
Java 9, 10, 11Java 9, 10, 11
Java 9, 10, 11
 
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)
 
Apache Ant
Apache AntApache Ant
Apache Ant
 
ZEO/RelStorage/PostgreSQL
ZEO/RelStorage/PostgreSQLZEO/RelStorage/PostgreSQL
ZEO/RelStorage/PostgreSQL
 
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
 
Minicurso de Segurança em Java EE 7
Minicurso de Segurança em Java EE 7Minicurso de Segurança em Java EE 7
Minicurso de Segurança em Java EE 7
 
Apache Struts
Apache StrutsApache Struts
Apache Struts
 
Coisas que aprendi e quero passar adiante - RubyConf Brasil 2010
Coisas que aprendi e quero passar adiante - RubyConf Brasil 2010Coisas que aprendi e quero passar adiante - RubyConf Brasil 2010
Coisas que aprendi e quero passar adiante - RubyConf Brasil 2010
 
Abstração do banco de dados com PHP Doctrine
Abstração do banco de dados com PHP DoctrineAbstração do banco de dados com PHP Doctrine
Abstração do banco de dados com PHP Doctrine
 
How to use Elasticsearch Analyzers by EmergiNet
How to use  Elasticsearch Analyzers by EmergiNetHow to use  Elasticsearch Analyzers by EmergiNet
How to use Elasticsearch Analyzers by EmergiNet
 

Destacado

Nouveaux-business-models- mode canvas
Nouveaux-business-models- mode canvasNouveaux-business-models- mode canvas
Nouveaux-business-models- mode canvasHenri Kaufman
 
Dominator: Rectifieuse plane de profils à CN et avance lente de Jones & Shipman
Dominator: Rectifieuse plane de profils à CN et avance lente de Jones & ShipmanDominator: Rectifieuse plane de profils à CN et avance lente de Jones & Shipman
Dominator: Rectifieuse plane de profils à CN et avance lente de Jones & Shipmanjonesshipman
 
02.10.2011 SC B.A.T II
02.10.2011   SC B.A.T II02.10.2011   SC B.A.T II
02.10.2011 SC B.A.T IIHerdwangerSV
 
Atelier agile 2009_09_27
Atelier agile 2009_09_27Atelier agile 2009_09_27
Atelier agile 2009_09_27domidp
 
Presentació assamblea
Presentació assamblea Presentació assamblea
Presentació assamblea FC Barcelona
 
Campus M21 | Medienpraxis III: Online / Social Media - Vorlesung II
Campus M21 | Medienpraxis III: Online / Social Media - Vorlesung IICampus M21 | Medienpraxis III: Online / Social Media - Vorlesung II
Campus M21 | Medienpraxis III: Online / Social Media - Vorlesung IIDaniel Rehn
 
Semana 5: Caracteres, tipos char e int, tipos de valor vs. tipos de referência
Semana  5: Caracteres, tipos char e int, tipos de valor vs. tipos de referênciaSemana  5: Caracteres, tipos char e int, tipos de valor vs. tipos de referência
Semana 5: Caracteres, tipos char e int, tipos de valor vs. tipos de referênciaManuel Menezes de Sequeira
 
Campus M21 | Medienpraxis II: Online - Vorlesung I vom 30.01.2013
Campus M21 | Medienpraxis II: Online - Vorlesung I vom 30.01.2013Campus M21 | Medienpraxis II: Online - Vorlesung I vom 30.01.2013
Campus M21 | Medienpraxis II: Online - Vorlesung I vom 30.01.2013Daniel Rehn
 
Apresentação Java Web Si Ufc Quixadá
Apresentação Java Web Si Ufc QuixadáApresentação Java Web Si Ufc Quixadá
Apresentação Java Web Si Ufc QuixadáZarathon Maia
 
Campus M21 | Medienpraxis II: Online - Vorlesung I vom 31.01.2013
Campus M21 | Medienpraxis II: Online - Vorlesung I vom 31.01.2013Campus M21 | Medienpraxis II: Online - Vorlesung I vom 31.01.2013
Campus M21 | Medienpraxis II: Online - Vorlesung I vom 31.01.2013Daniel Rehn
 
2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev.
2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev.2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev.
2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev.MongoDB
 
ECM-Webinar: Alfresco Migration Bestandsdaten Teil 2
ECM-Webinar: Alfresco Migration Bestandsdaten Teil 2ECM-Webinar: Alfresco Migration Bestandsdaten Teil 2
ECM-Webinar: Alfresco Migration Bestandsdaten Teil 2dmc digital media center GmbH
 
Què ha fet ICV-EUiA amb el meu vot?
Què ha fet ICV-EUiA amb el meu vot?Què ha fet ICV-EUiA amb el meu vot?
Què ha fet ICV-EUiA amb el meu vot?iniciativaverds
 
Lean Kanban FR 2013 - Vin et kanban
Lean Kanban FR 2013 - Vin et kanbanLean Kanban FR 2013 - Vin et kanban
Lean Kanban FR 2013 - Vin et kanbanJulien Fallet
 
SQL Server 2008 'Best Practices' - Stéphane Haby, dbi services - Mövenpick La...
SQL Server 2008 'Best Practices' - Stéphane Haby, dbi services - Mövenpick La...SQL Server 2008 'Best Practices' - Stéphane Haby, dbi services - Mövenpick La...
SQL Server 2008 'Best Practices' - Stéphane Haby, dbi services - Mövenpick La...dbi services
 
Présentation LMAX Disruptor So@t
Présentation LMAX Disruptor So@tPrésentation LMAX Disruptor So@t
Présentation LMAX Disruptor So@tFrancois Ostyn
 

Destacado (20)

Nouveaux-business-models- mode canvas
Nouveaux-business-models- mode canvasNouveaux-business-models- mode canvas
Nouveaux-business-models- mode canvas
 
Dominator: Rectifieuse plane de profils à CN et avance lente de Jones & Shipman
Dominator: Rectifieuse plane de profils à CN et avance lente de Jones & ShipmanDominator: Rectifieuse plane de profils à CN et avance lente de Jones & Shipman
Dominator: Rectifieuse plane de profils à CN et avance lente de Jones & Shipman
 
02.10.2011 SC B.A.T II
02.10.2011   SC B.A.T II02.10.2011   SC B.A.T II
02.10.2011 SC B.A.T II
 
Atelier agile 2009_09_27
Atelier agile 2009_09_27Atelier agile 2009_09_27
Atelier agile 2009_09_27
 
Einführung in SCRUM
Einführung in SCRUMEinführung in SCRUM
Einführung in SCRUM
 
Presentació assamblea
Presentació assamblea Presentació assamblea
Presentació assamblea
 
Campus M21 | Medienpraxis III: Online / Social Media - Vorlesung II
Campus M21 | Medienpraxis III: Online / Social Media - Vorlesung IICampus M21 | Medienpraxis III: Online / Social Media - Vorlesung II
Campus M21 | Medienpraxis III: Online / Social Media - Vorlesung II
 
MySQL Query Optimization
MySQL Query OptimizationMySQL Query Optimization
MySQL Query Optimization
 
Semana 5: Caracteres, tipos char e int, tipos de valor vs. tipos de referência
Semana  5: Caracteres, tipos char e int, tipos de valor vs. tipos de referênciaSemana  5: Caracteres, tipos char e int, tipos de valor vs. tipos de referência
Semana 5: Caracteres, tipos char e int, tipos de valor vs. tipos de referência
 
Campus M21 | Medienpraxis II: Online - Vorlesung I vom 30.01.2013
Campus M21 | Medienpraxis II: Online - Vorlesung I vom 30.01.2013Campus M21 | Medienpraxis II: Online - Vorlesung I vom 30.01.2013
Campus M21 | Medienpraxis II: Online - Vorlesung I vom 30.01.2013
 
Tutorialphpmyadmin
TutorialphpmyadminTutorialphpmyadmin
Tutorialphpmyadmin
 
Apresentação Java Web Si Ufc Quixadá
Apresentação Java Web Si Ufc QuixadáApresentação Java Web Si Ufc Quixadá
Apresentação Java Web Si Ufc Quixadá
 
Campus M21 | Medienpraxis II: Online - Vorlesung I vom 31.01.2013
Campus M21 | Medienpraxis II: Online - Vorlesung I vom 31.01.2013Campus M21 | Medienpraxis II: Online - Vorlesung I vom 31.01.2013
Campus M21 | Medienpraxis II: Online - Vorlesung I vom 31.01.2013
 
2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev.
2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev.2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev.
2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev.
 
ECM-Webinar: Alfresco Migration Bestandsdaten Teil 2
ECM-Webinar: Alfresco Migration Bestandsdaten Teil 2ECM-Webinar: Alfresco Migration Bestandsdaten Teil 2
ECM-Webinar: Alfresco Migration Bestandsdaten Teil 2
 
Què ha fet ICV-EUiA amb el meu vot?
Què ha fet ICV-EUiA amb el meu vot?Què ha fet ICV-EUiA amb el meu vot?
Què ha fet ICV-EUiA amb el meu vot?
 
Lean Kanban FR 2013 - Vin et kanban
Lean Kanban FR 2013 - Vin et kanbanLean Kanban FR 2013 - Vin et kanban
Lean Kanban FR 2013 - Vin et kanban
 
SQL Server 2008 'Best Practices' - Stéphane Haby, dbi services - Mövenpick La...
SQL Server 2008 'Best Practices' - Stéphane Haby, dbi services - Mövenpick La...SQL Server 2008 'Best Practices' - Stéphane Haby, dbi services - Mövenpick La...
SQL Server 2008 'Best Practices' - Stéphane Haby, dbi services - Mövenpick La...
 
Présentation LMAX Disruptor So@t
Présentation LMAX Disruptor So@tPrésentation LMAX Disruptor So@t
Présentation LMAX Disruptor So@t
 
NotORM
NotORMNotORM
NotORM
 

Similar a Otimizacao de aplicações Zend Framework

Detectando e Respondendo Incidentes de Segurança em Frontends Nginx utilizand...
Detectando e Respondendo Incidentes de Segurança em Frontends Nginx utilizand...Detectando e Respondendo Incidentes de Segurança em Frontends Nginx utilizand...
Detectando e Respondendo Incidentes de Segurança em Frontends Nginx utilizand...Jeronimo Zucco
 
Tchelinux live 2020 - Detectando e Respondendo Incidentes de Segurança em Fro...
Tchelinux live 2020 - Detectando e Respondendo Incidentes de Segurança em Fro...Tchelinux live 2020 - Detectando e Respondendo Incidentes de Segurança em Fro...
Tchelinux live 2020 - Detectando e Respondendo Incidentes de Segurança em Fro...Jeronimo Zucco
 
Elastic MeetUp Porto Alegre
Elastic MeetUp Porto AlegreElastic MeetUp Porto Alegre
Elastic MeetUp Porto AlegreRafael Gomes
 
Oficina PostgreSQL Básico Latinoware 2012
Oficina PostgreSQL Básico Latinoware 2012Oficina PostgreSQL Básico Latinoware 2012
Oficina PostgreSQL Básico Latinoware 2012Fabrízio Mello
 
JBoss-WildFly - Avançado
JBoss-WildFly - AvançadoJBoss-WildFly - Avançado
JBoss-WildFly - AvançadoAdriano Schmidt
 
MySQL em 10min - Alexandre Almeida HTI Tecnologia
MySQL em 10min - Alexandre Almeida HTI TecnologiaMySQL em 10min - Alexandre Almeida HTI Tecnologia
MySQL em 10min - Alexandre Almeida HTI TecnologiaMySQL Brasil
 
Oficina postgresql basico_consegi2010
Oficina postgresql basico_consegi2010Oficina postgresql basico_consegi2010
Oficina postgresql basico_consegi2010Fabrízio Mello
 
Desenvolvendo aplicações Web escaláveis
Desenvolvendo aplicações Web escaláveisDesenvolvendo aplicações Web escaláveis
Desenvolvendo aplicações Web escaláveiselliando dias
 
Qualidade no desenvolvimento de software com PHPUnit
Qualidade no desenvolvimento de software com PHPUnitQualidade no desenvolvimento de software com PHPUnit
Qualidade no desenvolvimento de software com PHPUnitDiego Tremper
 
Ao infinito e além com PHP memcached e Gearman
Ao infinito e além com PHP memcached e GearmanAo infinito e além com PHP memcached e Gearman
Ao infinito e além com PHP memcached e GearmanElton Minetto
 
Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2PrinceGuru MS
 
Integração de Sistemas usando tecnologias open source
Integração de Sistemas usando tecnologias open sourceIntegração de Sistemas usando tecnologias open source
Integração de Sistemas usando tecnologias open sourceTiago Peczenyj
 
Desenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App EngineDesenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App EngineCampus Party Brasil
 
Teste de Integração - Unidade III
Teste de Integração - Unidade IIITeste de Integração - Unidade III
Teste de Integração - Unidade IIIJoão Lourenço
 
PHP, Gearman e Memcache
PHP, Gearman e MemcachePHP, Gearman e Memcache
PHP, Gearman e MemcacheAndre Golvea
 
Cakephp - framework de desenvolvimento de aplicações Web em PHP
Cakephp - framework de desenvolvimento de aplicações Web em PHPCakephp - framework de desenvolvimento de aplicações Web em PHP
Cakephp - framework de desenvolvimento de aplicações Web em PHPArlindo Santos
 
IaaS: Implantação e gerenciamento de configurações de ambientes Cloud usando...
 IaaS: Implantação e gerenciamento de configurações de ambientes Cloud usando... IaaS: Implantação e gerenciamento de configurações de ambientes Cloud usando...
IaaS: Implantação e gerenciamento de configurações de ambientes Cloud usando...Diego Santos
 
Bancos de dados open source
Bancos de dados open sourceBancos de dados open source
Bancos de dados open sourceRodrigo Aurélio
 

Similar a Otimizacao de aplicações Zend Framework (20)

Detectando e Respondendo Incidentes de Segurança em Frontends Nginx utilizand...
Detectando e Respondendo Incidentes de Segurança em Frontends Nginx utilizand...Detectando e Respondendo Incidentes de Segurança em Frontends Nginx utilizand...
Detectando e Respondendo Incidentes de Segurança em Frontends Nginx utilizand...
 
Tchelinux live 2020 - Detectando e Respondendo Incidentes de Segurança em Fro...
Tchelinux live 2020 - Detectando e Respondendo Incidentes de Segurança em Fro...Tchelinux live 2020 - Detectando e Respondendo Incidentes de Segurança em Fro...
Tchelinux live 2020 - Detectando e Respondendo Incidentes de Segurança em Fro...
 
Elastic MeetUp Porto Alegre
Elastic MeetUp Porto AlegreElastic MeetUp Porto Alegre
Elastic MeetUp Porto Alegre
 
Oficina PostgreSQL Básico Latinoware 2012
Oficina PostgreSQL Básico Latinoware 2012Oficina PostgreSQL Básico Latinoware 2012
Oficina PostgreSQL Básico Latinoware 2012
 
JBoss-WildFly - Avançado
JBoss-WildFly - AvançadoJBoss-WildFly - Avançado
JBoss-WildFly - Avançado
 
MySQL em 10min - Alexandre Almeida HTI Tecnologia
MySQL em 10min - Alexandre Almeida HTI TecnologiaMySQL em 10min - Alexandre Almeida HTI Tecnologia
MySQL em 10min - Alexandre Almeida HTI Tecnologia
 
Oficina postgresql basico_consegi2010
Oficina postgresql basico_consegi2010Oficina postgresql basico_consegi2010
Oficina postgresql basico_consegi2010
 
Desenvolvendo aplicações Web escaláveis
Desenvolvendo aplicações Web escaláveisDesenvolvendo aplicações Web escaláveis
Desenvolvendo aplicações Web escaláveis
 
Otimização MySQL
Otimização MySQLOtimização MySQL
Otimização MySQL
 
Qualidade no desenvolvimento de software com PHPUnit
Qualidade no desenvolvimento de software com PHPUnitQualidade no desenvolvimento de software com PHPUnit
Qualidade no desenvolvimento de software com PHPUnit
 
Ao infinito e além com PHP memcached e Gearman
Ao infinito e além com PHP memcached e GearmanAo infinito e além com PHP memcached e Gearman
Ao infinito e além com PHP memcached e Gearman
 
Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2
 
Integração de Sistemas usando tecnologias open source
Integração de Sistemas usando tecnologias open sourceIntegração de Sistemas usando tecnologias open source
Integração de Sistemas usando tecnologias open source
 
Desenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App EngineDesenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App Engine
 
PHP e Redis
PHP e RedisPHP e Redis
PHP e Redis
 
Teste de Integração - Unidade III
Teste de Integração - Unidade IIITeste de Integração - Unidade III
Teste de Integração - Unidade III
 
PHP, Gearman e Memcache
PHP, Gearman e MemcachePHP, Gearman e Memcache
PHP, Gearman e Memcache
 
Cakephp - framework de desenvolvimento de aplicações Web em PHP
Cakephp - framework de desenvolvimento de aplicações Web em PHPCakephp - framework de desenvolvimento de aplicações Web em PHP
Cakephp - framework de desenvolvimento de aplicações Web em PHP
 
IaaS: Implantação e gerenciamento de configurações de ambientes Cloud usando...
 IaaS: Implantação e gerenciamento de configurações de ambientes Cloud usando... IaaS: Implantação e gerenciamento de configurações de ambientes Cloud usando...
IaaS: Implantação e gerenciamento de configurações de ambientes Cloud usando...
 
Bancos de dados open source
Bancos de dados open sourceBancos de dados open source
Bancos de dados open source
 

Más de Elton Minetto

Go e Microserviços - Nascidos um para o outro
Go e Microserviços - Nascidos um para o outroGo e Microserviços - Nascidos um para o outro
Go e Microserviços - Nascidos um para o outroElton Minetto
 
Object Calisthenics em Go
Object Calisthenics em GoObject Calisthenics em Go
Object Calisthenics em GoElton Minetto
 
Programar != desenvolver software (v2)
Programar != desenvolver software (v2)Programar != desenvolver software (v2)
Programar != desenvolver software (v2)Elton Minetto
 
Gerenciando uma startup no Github Projects
Gerenciando uma startup no Github ProjectsGerenciando uma startup no Github Projects
Gerenciando uma startup no Github ProjectsElton Minetto
 
Clean architecture em Go - v2
Clean architecture em Go - v2Clean architecture em Go - v2
Clean architecture em Go - v2Elton Minetto
 
Programar != desenvolver software
Programar != desenvolver softwareProgramar != desenvolver software
Programar != desenvolver softwareElton Minetto
 
Clean Architecture em PHP
Clean Architecture em PHPClean Architecture em PHP
Clean Architecture em PHPElton Minetto
 
Clean Architecture in Golang
Clean Architecture in GolangClean Architecture in Golang
Clean Architecture in GolangElton Minetto
 
A jornada do desenvolvedor
A jornada do desenvolvedorA jornada do desenvolvedor
A jornada do desenvolvedorElton Minetto
 
Product and Technology
Product and TechnologyProduct and Technology
Product and TechnologyElton Minetto
 
Code:Nation Tech Stack
Code:Nation Tech StackCode:Nation Tech Stack
Code:Nation Tech StackElton Minetto
 
Modernizando projetos legados usando APIs
Modernizando projetos legados usando APIsModernizando projetos legados usando APIs
Modernizando projetos legados usando APIsElton Minetto
 
12 factor in the PHP world
12 factor in the PHP world12 factor in the PHP world
12 factor in the PHP worldElton Minetto
 
Building APIs using Go
Building APIs using GoBuilding APIs using Go
Building APIs using GoElton Minetto
 
O case da Compufácil e AWS
O case da Compufácil e AWSO case da Compufácil e AWS
O case da Compufácil e AWSElton Minetto
 

Más de Elton Minetto (20)

Go e Microserviços - Nascidos um para o outro
Go e Microserviços - Nascidos um para o outroGo e Microserviços - Nascidos um para o outro
Go e Microserviços - Nascidos um para o outro
 
Object Calisthenics em Go
Object Calisthenics em GoObject Calisthenics em Go
Object Calisthenics em Go
 
Programar != desenvolver software (v2)
Programar != desenvolver software (v2)Programar != desenvolver software (v2)
Programar != desenvolver software (v2)
 
Gerenciando uma startup no Github Projects
Gerenciando uma startup no Github ProjectsGerenciando uma startup no Github Projects
Gerenciando uma startup no Github Projects
 
Clean Architecture
Clean ArchitectureClean Architecture
Clean Architecture
 
Serverless em Go
Serverless em GoServerless em Go
Serverless em Go
 
JAMstack
JAMstackJAMstack
JAMstack
 
Clean architecture em Go - v2
Clean architecture em Go - v2Clean architecture em Go - v2
Clean architecture em Go - v2
 
Programar != desenvolver software
Programar != desenvolver softwareProgramar != desenvolver software
Programar != desenvolver software
 
Clean Architecture em PHP
Clean Architecture em PHPClean Architecture em PHP
Clean Architecture em PHP
 
Clean Architecture in Golang
Clean Architecture in GolangClean Architecture in Golang
Clean Architecture in Golang
 
A jornada do desenvolvedor
A jornada do desenvolvedorA jornada do desenvolvedor
A jornada do desenvolvedor
 
Product and Technology
Product and TechnologyProduct and Technology
Product and Technology
 
Code:Nation Tech Stack
Code:Nation Tech StackCode:Nation Tech Stack
Code:Nation Tech Stack
 
Modernizando projetos legados usando APIs
Modernizando projetos legados usando APIsModernizando projetos legados usando APIs
Modernizando projetos legados usando APIs
 
12 factor in the PHP world
12 factor in the PHP world12 factor in the PHP world
12 factor in the PHP world
 
Building APIs using Go
Building APIs using GoBuilding APIs using Go
Building APIs using Go
 
Start you
Start youStart you
Start you
 
O case da Compufácil e AWS
O case da Compufácil e AWSO case da Compufácil e AWS
O case da Compufácil e AWS
 
Introdução a Go
Introdução a GoIntrodução a Go
Introdução a Go
 

Otimizacao de aplicações Zend Framework

  • 1. Otimizando aplicações com Zend Framework elton luís minetto @eminetto segunda-feira, 8 de agosto de 11
  • 2. 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
  • 4. segunda-feira, 8 de agosto de 11
  • 5. segunda-feira, 8 de agosto de 11
  • 6. segunda-feira, 8 de agosto de 11
  • 7. segunda-feira, 8 de agosto de 11
  • 8. 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
  • 9. 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
  • 10. 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
  • 11. 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
  • 12. 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
  • 13. Criando o projeto zf 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
  • 14. O primeiro teste (sem APC) • Transações por segundo: 51,55 segunda-feira, 8 de agosto de 11
  • 15. APC • Transações por segundo: 110,94 segunda-feira, 8 de agosto de 11
  • 16. 120 90 60 30 0 Sem APC Com APC Transações/seg segunda-feira, 8 de agosto de 11
  • 17. 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 segunda-feira, 8 de agosto de 11
  • 18. Banco de dados zf configure dbadapter "adapter=Pdo_Mysql&host=localhost&username=root&password=root&dbname=pe rformance" zf create db-table Post post zf create controller Post segunda-feira, 8 de agosto de 11
  • 19. Banco de dados <?php class 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
  • 20. 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
  • 21. Banco de dados • Transações por segundo: 85,25 segunda-feira, 8 de agosto de 11
  • 22. 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
  • 23. Banco de dados usando cache em disco • Transações por segundo: 100,70 segunda-feira, 8 de agosto de 11
  • 24. Banco de dados usando cache em MEMCACHE <?php class 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
  • 25. Banco de dados usando cache em Memcache • Transações por segundo: 102,85 segunda-feira, 8 de agosto de 11
  • 26. 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
  • 27. Cache do html <?php class 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
  • 28. Cache do HTML • Transações por segundo: 109,11 segunda-feira, 8 de agosto de 11
  • 29. 110,0 82,5 55,0 27,5 0 BD Cache em Disco Cache em Memcache Cache de HTML Transações/seg segunda-feira, 8 de agosto de 11
  • 30. 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
  • 31. 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; } segunda-feira, 8 de agosto de 11
  • 32. Inclusão em banco de dados • Transações por segundo: 108,45 segunda-feira, 8 de agosto de 11
  • 33. Inclusão em banco de dados - Gearman //novo método no PostController public 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
  • 34. Inclusão em banco de dados - gearman • Transações por segundo: 109,61 segunda-feira, 8 de agosto de 11
  • 35. 110,0 109,5 109,0 108,5 108,0 Inclusão Gearman Transações/seg segunda-feira, 8 de agosto de 11
  • 36. 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
  • 37. 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 segunda-feira, 8 de agosto de 11
  • 38. contato <?php $card = array( ‘nome’ => ‘Elton Luís Minetto’, ‘site’ => ‘http://www.eltonminetto.net’, ‘e-mail’ => ‘eminetto@coderockr.com’, ‘twitter’ => ‘@eminetto’, ‘all’ => ‘http://eminetto.me’ ); var_dump($card); ?> segunda-feira, 8 de agosto de 11