SlideShare uma empresa Scribd logo
1 de 39
Baixar para ler offline
Otimizando aplicações com Zend Framework

                                    elton luís minetto
                                        @eminetto



segunda-feira, 15 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
          Membro do PHPSC e sócio da Coderockr


segunda-feira, 15 de agosto de 11
Métricas

segunda-feira, 15 de agosto de 11
segunda-feira, 15 de agosto de 11
segunda-feira, 15 de agosto de 11
segunda-feira, 15 de agosto de 11
segunda-feira, 15 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 tempo e
                      recurso



segunda-feira, 15 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, 15 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, 15 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, 15 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, 15 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, 15 de agosto de 11
O primeiro teste
          (sem APC)


               Transações por segundo: 51,55




segunda-feira, 15 de agosto de 11
APC



               Transações por segundo: 110,94




segunda-feira, 15 de agosto de 11
120




                       90




                       60




                       30




                        0
                                    Sem APC                    Com APC




                                              Transações/seg




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




segunda-feira, 15 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, 15 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, 15 de agosto de 11
Banco de dados



               Transações por segundo: 85,25




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


               Transações por segundo: 100,70




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


               Transações por segundo: 102,85




segunda-feira, 15 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, 15 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, 15 de agosto de 11
Cache do HTML



               Transações por segundo: 109,11




segunda-feira, 15 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, 15 de agosto de 11
Escalando
                                        Requisições por segundo/usuários simultâneos
                           300




                           225




                           150




                            75




                             0
                                 100       200                                500      1000



                                       Cache em disco             Memcached




segunda-feira, 15 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, 15 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, 15 de agosto de 11
Inclusão em banco de dados



               Transações por segundo: 108,45




segunda-feira, 15 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, 15 de agosto de 11
Inclusão em banco de dados
          - gearman


               Transações por segundo: 109,61




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




                    109,5




                    109,0




                    108,5




                    108,0
                                    Inclusão                    Gearman




                                               Transações/seg




segunda-feira, 15 de agosto de 11
Escalando
                                    Requisições por segundo/usuários simultâneos
                  300




                  225




                  150




                   75




                    0
                        100           200                                 500      10000




                                        Insert MySQL                Gearman




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

Mais conteúdo relacionado

Mais procurados

Aumente a performance de seu site de maneira disciplinada
Aumente a performance de seu site de maneira disciplinadaAumente a performance de seu site de maneira disciplinada
Aumente a performance de seu site de maneira disciplinada
Henrique Lima
 
Changelog trunk
Changelog trunkChangelog trunk
Changelog trunk
srwawa12
 
SegurançA BáSica Do Apache
SegurançA BáSica Do ApacheSegurançA BáSica Do Apache
SegurançA BáSica Do Apache
Felipe Santos
 

Mais procurados (20)

Entre na fila. Processamento distribuído usando Gearman
Entre na fila. Processamento distribuído usando GearmanEntre na fila. Processamento distribuído usando Gearman
Entre na fila. Processamento distribuído usando Gearman
 
UOL Tech Day: Testes de Integração com OpenEJB
UOL Tech Day: Testes de Integração com OpenEJBUOL Tech Day: Testes de Integração com OpenEJB
UOL Tech Day: Testes de Integração com OpenEJB
 
Rancher e ansible
Rancher e ansibleRancher e ansible
Rancher e ansible
 
Vagrant + Puppet
Vagrant + PuppetVagrant + Puppet
Vagrant + Puppet
 
Stored Procedures and Triggers
Stored Procedures and TriggersStored Procedures and Triggers
Stored Procedures and Triggers
 
Estratégia de backup - RMAN
Estratégia de backup - RMANEstratégia de backup - RMAN
Estratégia de backup - RMAN
 
Aumente a performance de seu site de maneira disciplinada
Aumente a performance de seu site de maneira disciplinadaAumente a performance de seu site de maneira disciplinada
Aumente a performance de seu site de maneira disciplinada
 
IT security - Fail2ban, fail2sql e googlemaps (PT Language)
IT security  - Fail2ban, fail2sql e googlemaps (PT Language)IT security  - Fail2ban, fail2sql e googlemaps (PT Language)
IT security - Fail2ban, fail2sql e googlemaps (PT Language)
 
Tuning Apache/MySQL/PHP para desenvolvedores
Tuning Apache/MySQL/PHP para desenvolvedoresTuning Apache/MySQL/PHP para desenvolvedores
Tuning Apache/MySQL/PHP para desenvolvedores
 
Puppet overview
Puppet overviewPuppet overview
Puppet overview
 
Changelog trunk
Changelog trunkChangelog trunk
Changelog trunk
 
Java 08
Java 08Java 08
Java 08
 
Fundamentos Replicação MySQL
Fundamentos Replicação MySQLFundamentos Replicação MySQL
Fundamentos Replicação MySQL
 
SegurançA BáSica Do Apache
SegurançA BáSica Do ApacheSegurançA BáSica Do Apache
SegurançA BáSica Do Apache
 
A busca pelo deploy continuo
A busca pelo deploy continuoA busca pelo deploy continuo
A busca pelo deploy continuo
 
UNIFAL - MySQL Logs - 5.0/5.6
UNIFAL - MySQL Logs - 5.0/5.6UNIFAL - MySQL Logs - 5.0/5.6
UNIFAL - MySQL Logs - 5.0/5.6
 
DELPHI & MySQL - September 2004
DELPHI & MySQL - September 2004DELPHI & MySQL - September 2004
DELPHI & MySQL - September 2004
 
PostgreSQL Tuning: O elefante mais rápido que um leopardo
PostgreSQL Tuning: O elefante mais rápido que um leopardoPostgreSQL Tuning: O elefante mais rápido que um leopardo
PostgreSQL Tuning: O elefante mais rápido que um leopardo
 
ZEO/RelStorage/PostgreSQL
ZEO/RelStorage/PostgreSQLZEO/RelStorage/PostgreSQL
ZEO/RelStorage/PostgreSQL
 
PostgreSQL: Performance Tuning
PostgreSQL: Performance TuningPostgreSQL: Performance Tuning
PostgreSQL: Performance Tuning
 

Destaque

Atelier agile 2009_09_27
Atelier agile 2009_09_27Atelier agile 2009_09_27
Atelier agile 2009_09_27
domidp
 
Ligação do Flex a um backend LAMP usando AMFPHP
Ligação do Flex a um backend LAMP usando AMFPHPLigação do Flex a um backend LAMP usando AMFPHP
Ligação do Flex a um backend LAMP usando AMFPHP
elliando dias
 
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 2
dmc digital media center GmbH
 

Destaque (20)

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
 
NotORM
NotORMNotORM
NotORM
 
Einführung in SCRUM
Einführung in SCRUMEinführung in SCRUM
Einführung in SCRUM
 
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?
 
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...
 
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
 
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á
 
MySQL Query Optimization
MySQL Query OptimizationMySQL Query Optimization
MySQL Query Optimization
 
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
 
Presentació assamblea
Presentació assamblea Presentació assamblea
Presentació assamblea
 
Atelier agile 2009_09_27
Atelier agile 2009_09_27Atelier agile 2009_09_27
Atelier agile 2009_09_27
 
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
 
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
 
Campus M21 | Medienpraxis II: Online - Vorlesung III vom 11.02.2013
Campus M21 | Medienpraxis II: Online - Vorlesung III vom 11.02.2013Campus M21 | Medienpraxis II: Online - Vorlesung III vom 11.02.2013
Campus M21 | Medienpraxis II: Online - Vorlesung III vom 11.02.2013
 
Ligação do Flex a um backend LAMP usando AMFPHP
Ligação do Flex a um backend LAMP usando AMFPHPLigação do Flex a um backend LAMP usando AMFPHP
Ligação do Flex a um backend LAMP usando AMFPHP
 
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
 
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
 
Digitale Mentalität II
Digitale Mentalität IIDigitale Mentalität II
Digitale Mentalität II
 

Semelhante a Otimizando aplicações Zend Framework - Tchelinux

Desenvolvendo aplicações Web escaláveis
Desenvolvendo aplicações Web escaláveisDesenvolvendo aplicações Web escaláveis
Desenvolvendo aplicações Web escaláveis
elliando dias
 
Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2
PrinceGuru MS
 

Semelhante a Otimizando aplicações Zend Framework - Tchelinux (20)

Desenvolvendo aplicações Web escaláveis
Desenvolvendo aplicações Web escaláveisDesenvolvendo aplicações Web escaláveis
Desenvolvendo aplicações Web escaláveis
 
Memcached, Gearman e Sphinx
Memcached, Gearman e SphinxMemcached, Gearman e Sphinx
Memcached, Gearman e Sphinx
 
PHP e Redis
PHP e RedisPHP e Redis
PHP e Redis
 
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
 
Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2
 
Cakephp 2.0 - O que mudou
Cakephp 2.0 - O que mudouCakephp 2.0 - O que mudou
Cakephp 2.0 - O que mudou
 
O que esperar do Zend Framework 3
O que esperar do Zend Framework 3O que esperar do Zend Framework 3
O que esperar do Zend Framework 3
 
Integração Contínua com CruiseControl e phpUnderControl
Integração Contínua com CruiseControl e phpUnderControlIntegração Contínua com CruiseControl e phpUnderControl
Integração Contínua com CruiseControl e phpUnderControl
 
Apache NiFi com postgresql
Apache NiFi com postgresqlApache NiFi com postgresql
Apache NiFi com postgresql
 
Apache NiFi com PostgreSQL - PGConf.Brasil 2018
Apache NiFi com PostgreSQL - PGConf.Brasil 2018Apache NiFi com PostgreSQL - PGConf.Brasil 2018
Apache NiFi com PostgreSQL - PGConf.Brasil 2018
 
Hello SAFE World!!!
Hello SAFE World!!!Hello SAFE World!!!
Hello SAFE World!!!
 
Integracao Contínua com CruiseControl e phpUnderControl
Integracao Contínua com CruiseControl e phpUnderControlIntegracao Contínua com CruiseControl e phpUnderControl
Integracao Contínua com CruiseControl e phpUnderControl
 
Integração Contínua com CruiseControl e phpUnderControl
Integração Contínua com CruiseControl e phpUnderControlIntegração Contínua com CruiseControl e phpUnderControl
Integração Contínua com CruiseControl e phpUnderControl
 
Dev Ext PHP
Dev Ext PHPDev Ext PHP
Dev Ext PHP
 
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
 
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
 
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)
 
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...
 
Ganhando tempo com casos de testes
Ganhando tempo com casos de testesGanhando tempo com casos de testes
Ganhando tempo com casos de testes
 
TDC2017 | POA Trilha Programacao Funicional - (Nunca) Ouvi falar de Rust... m...
TDC2017 | POA Trilha Programacao Funicional - (Nunca) Ouvi falar de Rust... m...TDC2017 | POA Trilha Programacao Funicional - (Nunca) Ouvi falar de Rust... m...
TDC2017 | POA Trilha Programacao Funicional - (Nunca) Ouvi falar de Rust... m...
 

Mais de Elton Minetto

Mais 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
 

Último

Apresentação Power Embedded - Descubra uma nova forma de compartilhar relatór...
Apresentação Power Embedded - Descubra uma nova forma de compartilhar relatór...Apresentação Power Embedded - Descubra uma nova forma de compartilhar relatór...
Apresentação Power Embedded - Descubra uma nova forma de compartilhar relatór...
Dirceu Resende
 

Último (11)

Apostila e caderno de exercicios de WORD
Apostila e caderno de exercicios de  WORDApostila e caderno de exercicios de  WORD
Apostila e caderno de exercicios de WORD
 
Entrevistas, artigos, livros & citações de Paulo Pagliusi
Entrevistas, artigos, livros & citações de Paulo PagliusiEntrevistas, artigos, livros & citações de Paulo Pagliusi
Entrevistas, artigos, livros & citações de Paulo Pagliusi
 
Apresentação Power Embedded - Descubra uma nova forma de compartilhar relatór...
Apresentação Power Embedded - Descubra uma nova forma de compartilhar relatór...Apresentação Power Embedded - Descubra uma nova forma de compartilhar relatór...
Apresentação Power Embedded - Descubra uma nova forma de compartilhar relatór...
 
ATIVIDADE 1 - CÁLCULO DIFERENCIAL E INTEGRAL II - 52_2024.docx
ATIVIDADE 1 - CÁLCULO DIFERENCIAL E INTEGRAL II - 52_2024.docxATIVIDADE 1 - CÁLCULO DIFERENCIAL E INTEGRAL II - 52_2024.docx
ATIVIDADE 1 - CÁLCULO DIFERENCIAL E INTEGRAL II - 52_2024.docx
 
EAD Curso - CIÊNCIA DE DADOS NA INDÚSTTRIA
EAD Curso - CIÊNCIA DE DADOS NA INDÚSTTRIAEAD Curso - CIÊNCIA DE DADOS NA INDÚSTTRIA
EAD Curso - CIÊNCIA DE DADOS NA INDÚSTTRIA
 
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
 
COI CENTRO DE OPERAÇÕES INDUSTRIAIS NAS USINAS
COI CENTRO DE OPERAÇÕES INDUSTRIAIS NAS USINASCOI CENTRO DE OPERAÇÕES INDUSTRIAIS NAS USINAS
COI CENTRO DE OPERAÇÕES INDUSTRIAIS NAS USINAS
 
[ServiceNow] Upgrade de versão - 2ª edição (Revisada, atualizada e ampliada)
[ServiceNow] Upgrade de versão - 2ª edição (Revisada, atualizada e ampliada)[ServiceNow] Upgrade de versão - 2ª edição (Revisada, atualizada e ampliada)
[ServiceNow] Upgrade de versão - 2ª edição (Revisada, atualizada e ampliada)
 
From_SEH_Overwrite_with_Egg_Hunter_to_Get_a_Shell_PT-BR.pdf
From_SEH_Overwrite_with_Egg_Hunter_to_Get_a_Shell_PT-BR.pdfFrom_SEH_Overwrite_with_Egg_Hunter_to_Get_a_Shell_PT-BR.pdf
From_SEH_Overwrite_with_Egg_Hunter_to_Get_a_Shell_PT-BR.pdf
 
ATIVIDADE 1 - GESTÃO DE PESSOAS E DESENVOLVIMENTO DE EQUIPES - 52_2024.docx
ATIVIDADE 1 - GESTÃO DE PESSOAS E DESENVOLVIMENTO DE EQUIPES - 52_2024.docxATIVIDADE 1 - GESTÃO DE PESSOAS E DESENVOLVIMENTO DE EQUIPES - 52_2024.docx
ATIVIDADE 1 - GESTÃO DE PESSOAS E DESENVOLVIMENTO DE EQUIPES - 52_2024.docx
 
Palestras sobre Cibersegurança em Eventos - Paulo Pagliusi
Palestras sobre Cibersegurança em Eventos - Paulo PagliusiPalestras sobre Cibersegurança em Eventos - Paulo Pagliusi
Palestras sobre Cibersegurança em Eventos - Paulo Pagliusi
 

Otimizando aplicações Zend Framework - Tchelinux

  • 1. Otimizando aplicações com Zend Framework elton luís minetto @eminetto segunda-feira, 15 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 Membro do PHPSC e sócio da Coderockr segunda-feira, 15 de agosto de 11
  • 4. segunda-feira, 15 de agosto de 11
  • 5. segunda-feira, 15 de agosto de 11
  • 6. segunda-feira, 15 de agosto de 11
  • 7. segunda-feira, 15 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 tempo e recurso segunda-feira, 15 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, 15 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, 15 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, 15 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, 15 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, 15 de agosto de 11
  • 14. O primeiro teste (sem APC) Transações por segundo: 51,55 segunda-feira, 15 de agosto de 11
  • 15. APC Transações por segundo: 110,94 segunda-feira, 15 de agosto de 11
  • 16. 120 90 60 30 0 Sem APC Com APC Transações/seg segunda-feira, 15 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, 15 de agosto de 11
  • 18. 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 segunda-feira, 15 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, 15 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, 15 de agosto de 11
  • 21. Banco de dados Transações por segundo: 85,25 segunda-feira, 15 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, 15 de agosto de 11
  • 23. Banco de dados usando cache em disco Transações por segundo: 100,70 segunda-feira, 15 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, 15 de agosto de 11
  • 25. Banco de dados usando cache em Memcache Transações por segundo: 102,85 segunda-feira, 15 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, 15 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, 15 de agosto de 11
  • 28. Cache do HTML Transações por segundo: 109,11 segunda-feira, 15 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, 15 de agosto de 11
  • 30. Escalando Requisições por segundo/usuários simultâneos 300 225 150 75 0 100 200 500 1000 Cache em disco Memcached segunda-feira, 15 de agosto de 11
  • 31. 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, 15 de agosto de 11
  • 32. 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, 15 de agosto de 11
  • 33. Inclusão em banco de dados Transações por segundo: 108,45 segunda-feira, 15 de agosto de 11
  • 34. 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, 15 de agosto de 11
  • 35. Inclusão em banco de dados - gearman Transações por segundo: 109,61 segunda-feira, 15 de agosto de 11
  • 36. 110,0 109,5 109,0 108,5 108,0 Inclusão Gearman Transações/seg segunda-feira, 15 de agosto de 11
  • 37. Escalando Requisições por segundo/usuários simultâneos 300 225 150 75 0 100 200 500 10000 Insert MySQL Gearman segunda-feira, 15 de agosto de 11
  • 38. 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, 15 de agosto de 11
  • 39. 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, 15 de agosto de 11