Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Otimizando aplicações com Zend Framework

Otimizando aplicações com Zend Framework

Dicas de melhorias de performance para aplicativos feitos usando o Zend Framework

Elton Minetto

December 07, 2011
Tweet

More Decks by Elton Minetto

Other Decks in Programming

Transcript

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

    View full-size slide

  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

    View full-size slide

  3. 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

    View full-size slide

  4. 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)

    View full-size slide

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

    View full-size slide

  6. 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

    View full-size slide

  7. 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)

    View full-size slide

  8. 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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  12. 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

    View full-size slide

  13. 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

    View full-size slide

  14. Banco de dados
    class PostController extends Zend_Controller_Action
    {
    public function indexAction() {
    $post = new Application_Model_DbTable_Post();
    $this->view->entries = $post->fetchAll();
    }
    }

    View full-size slide

  15. Banco de dados
    application/views/scripts/post/index.phtml
    Posts:


    entries as $entry): ?>
    escape($entry->title) ?>
    escape($entry->text) ?>


    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  26. 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

    View full-size slide

  27. 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;
    }

    View full-size slide

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

    View full-size slide

  29. 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;
    }

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  33. 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

    View full-size slide

  34. Contato
    $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);

    View full-size slide