Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Otimizando aplicações Zend Framework - Tchelinux

2,267 views

Published on

Apresentação sobre otimizações em aplicações Zend Framework. Apresentado no Tchelinux Bento Gonçalves

Published in: Technology
  • Be the first to comment

Otimizando aplicações Zend Framework - Tchelinux

  1. 1. Otimizando aplicações com Zend Framework elton luís minetto @eminettosegunda-feira, 15 de agosto de 11
  2. 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 Coderockrsegunda-feira, 15 de agosto de 11
  3. 3. Métricassegunda-feira, 15 de agosto de 11
  4. 4. segunda-feira, 15 de agosto de 11
  5. 5. segunda-feira, 15 de agosto de 11
  6. 6. segunda-feira, 15 de agosto de 11
  7. 7. segunda-feira, 15 de agosto de 11
  8. 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 recursosegunda-feira, 15 de agosto de 11
  9. 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. 10. Conceitos O que medir Transações por unidade de tempo Tempo de resposta ou latência Escalonamento Concorrênciasegunda-feira, 15 de agosto de 11
  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.9segunda-feira, 15 de agosto de 11
  12. 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. 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.localsegunda-feira, 15 de agosto de 11
  14. 14. O primeiro teste (sem APC) Transações por segundo: 51,55segunda-feira, 15 de agosto de 11
  15. 15. APC Transações por segundo: 110,94segunda-feira, 15 de agosto de 11
  16. 16. 120 90 60 30 0 Sem APC Com APC Transações/segsegunda-feira, 15 de agosto de 11
  17. 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)" donesegunda-feira, 15 de agosto de 11
  18. 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 Postsegunda-feira, 15 de agosto de 11
  19. 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. 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. 21. Banco de dados Transações por segundo: 85,25segunda-feira, 15 de agosto de 11
  22. 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. 23. Banco de dados usando cache em disco Transações por segundo: 100,70segunda-feira, 15 de agosto de 11
  24. 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. 25. Banco de dados usando cache em Memcache Transações por segundo: 102,85segunda-feira, 15 de agosto de 11
  26. 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. 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. 28. Cache do HTML Transações por segundo: 109,11segunda-feira, 15 de agosto de 11
  29. 29. 110,0 82,5 55,0 27,5 0 BD Cache em Disco Cache em Memcache Cache de HTML Transações/segsegunda-feira, 15 de agosto de 11
  30. 30. Escalando Requisições por segundo/usuários simultâneos 300 225 150 75 0 100 200 500 1000 Cache em disco Memcachedsegunda-feira, 15 de agosto de 11
  31. 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 accesssegunda-feira, 15 de agosto de 11
  32. 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. 33. Inclusão em banco de dados Transações por segundo: 108,45segunda-feira, 15 de agosto de 11
  34. 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. 35. Inclusão em banco de dados - gearman Transações por segundo: 109,61segunda-feira, 15 de agosto de 11
  36. 36. 110,0 109,5 109,0 108,5 108,0 Inclusão Gearman Transações/segsegunda-feira, 15 de agosto de 11
  37. 37. Escalando Requisições por segundo/usuários simultâneos 300 225 150 75 0 100 200 500 10000 Insert MySQL Gearmansegunda-feira, 15 de agosto de 11
  38. 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-phpsegunda-feira, 15 de agosto de 11
  39. 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

×