Se ha denunciado esta presentación.
Utilizamos tu perfil de LinkedIn y tus datos de actividad para personalizar los anuncios y mostrarte publicidad más relevante. Puedes cambiar tus preferencias de publicidad en cualquier momento.

Modern PHP

1.019 visualizaciones

Publicado el

Apresentação intitulada "Modern PHP" que será apresentada na semana acadêmica da FACCAT (Taquara) entre os dias 25 a 29 de abril: http://techparty.faccat.br

Publicado en: Tecnología
  • Sé el primero en comentar

Modern PHP

  1. 1. Modern PHP Ari Stopassola Junior
  2. 2. 20 anos http://haphpy-birthday.net https://plus.google.com/115682389249477476280/posts
  3. 3. O começo… • Rasmus Lerdorf • Conjunto de scripts • "Personal Home Page Tools" • Viveu em Porto Alegre de 1991 a 1993 Extraído de: http://lerdorf.com/resume/
  4. 4. História
  5. 5. Popularidade http://w3techs.com/technologies/overview/programming_language/ all
  6. 6. +82% de TODA a internet usa PHP
  7. 7. Renascimento https://pt.wikipedia.org/wiki/Homem_Vitruviano_%28desenho_de_Leonardo_da_Vinci%29
  8. 8. Framework Interoperability Group
  9. 9. PSR PHP Standards Recommendations http://www.php-fig.org/psr/
  10. 10. PSR-1 http://www.php-fig.org/psr/psr- 1/ <?php namespace AgenciaReceptivo; class ItinerarioDePasseio { const IDADE_MIN = 5; public function montaRoteiro() { } } <?php ou <?= ?> Namespace s StudlyCap s MAIÚSCULA S camelCas e
  11. 11. PSR-2 http://www.php-fig.org/psr/psr-2/<?php namespace AgenciaReceptivo; class ItinerarioDePasseio { const IDADE_MIN = 5; public function montaRoteiro() { } } Identação com 4 espaços Não fecha ?> Visibilidade Chaves (classes e métodos) sempre em nova linha Linha em branco após a declaração de namespace
  12. 12. Coding Standards http://pear.php.net/package/PHP_CodeSniffer Instalação: pear install PHP_CodeSniffer ou apt-get install php-codesniffer (Linux) phpcs hello.php phpcs --standard=zend hello.php
  13. 13. Checar e corrigir • Para checar o PSR-1 e PSR-2 utilize o CodeSniffer: phpcs --standard=PSR2 arquivo.php • Para corrigir de eventuais problemas utilize Code Beautifier and Fixer: phpcbf --standard=PSR2 arquivo.php
  14. 14. Boas práticas vão além...
  15. 15. • Controle de versão. Ex.: git • Metodologias ágeis. Ex.: Scrum • Padrões de Projeto (design patterns) • Ambientes homogêneos. Ex.: Vagrant e Docker • Mecanismos de implantação (deployment) • Testes • API-centric • Conduta https://cleancoders.com
  16. 16. QA: quality assurance http://phpqatools.org
  17. 17. Outros padrões recomendados • PSR-3 Logger Interface • PSR-4 Autoloading Standard • PSR-6 Caching Interface • PSR-7 HTTP Message Interface
  18. 18. Componentes
  19. 19. Gestor de dependências para PHP http://getcomposer.org
  20. 20. Packagist: repositório de pacotes https://packagist.org php composer.phar require phpoffice/phpword https://packagist.org/statistics
  21. 21. <?php require "vendor/autoload.php"; $mail = new PHPMailer; $mail = null; $pdf = new fpdfFPDF(); $pdf->output("documento.pdf", "F"); $pdf = null; use PhpOfficePhpWordPhpWord; $doc = new PhpWord; $doc->save("documento.doc", 'Word2007'); use InterventionImageImageManagerStatic as Image; $img = Image::make('IMG_8529.JPG'); $img->resize(50, 50); $img->save('miniatura.jpg');
  22. 22. Instalação de componentes curl -sS https://getcomposer.org/installer | php php composer.phar require phpmailer/phpmailer php composer.phar require itbz/fpdf php composer.phar require phpoffice/phpword php composer.phar require intervention/image composer.json
  23. 23. Namespaces • Definições de classes são globais, portanto o desenvolvedor precisava ter cuidado ao nomear suas classes – podendo sobrescrever outras bibliotecas (de terceiros) • Uma estratégia de nomenclatura era criar algo como: Perito_Biblioteca_TrataImagem • Encapsula classes, funções e constantes • Resolve problemas no reuso de código, dentre eles: • Colisão entre nomes • Habilidade de abreviar nomes longos
  24. 24. Documentação
  25. 25. Documentação • Faz parser do código em busca de DocBlocks • Auto-documentação • Converte em HTML, PDF, CHM e XML (DocBook) • phpDocumentor http://www.phpdoc.org • DocBlox http://www.docblox-project.org • Doxygen http://www.doxygen.org • PHP Dox http://phpdox.net/
  26. 26. phpdoc -t docs/ -o PDF:default:default -d . Diretório local
  27. 27. Frameworks
  28. 28. “They all suck!” Rasmus Lerdorf – PHP Frameworks Day 2013
  29. 29. I'm kidding!
  30. 30. Life is full of choices...
  31. 31. Frameworks full-stack
  32. 32. Fonte: http://microphp.org
  33. 33. Provisionamento www.phansible.com
  34. 34. xDebug • Extensão PHP criada em 2002 por Derick Rethans • Ferramenta de debug e profiling para PHP • Empilhamento de funções e rastreamento de erros • Profiling detecta gargalos de performance • Permite uma execução passo-a-passo, mesmo remotamente (observando o conteúdo das variáveis) • Não utilize em servidores de produção! • Exibe informações privilegiadas e expõe brechas de segurança
  35. 35. Otimização
  36. 36. Profiling • Identificar gargalos • Analisa a execução do script e mede uso de memória, tempo de execução e frequência das chamadas de função • Ferramentas que fazem a leitura da saída cache grind: • KCachegrind • Webgrind • MacCallGrind • WinCacheGrind • xdebugtoolkit ou CachegrindVisualizer (geram .dot) • Graphviz (lê o .dot e gera uma árvore)
  37. 37. Profiler: KCachegrind
  38. 38. Profiler: webgrind https://github.com/jokkedk/webgrind
  39. 39. Opcode Cache • Scripts PHP são compilados on-the-fly • Supostamente mais lento que as linguagens pré-compiladas • Zend Optimizer+ tornou-se open source e foi renomeado para OPcache • Opcache gera um bytecode e o armazena em memória • É nativo no PHP 5.5 (desde que o PHP seja compilado com a opção --enable-opcache)
  40. 40. Lab: ApacheBench ab -n 100 -c 5 http://www.site.com/ Compare com e sem Opcache, onde diz: Time taken for tests
  41. 41. Cenário… Nesse caso o método CargaDescarga (também útil na classe Transfer) deverá ser copiado ✗
  42. 42. <?php class Passeios { function PagaComissao(){ return "Paga comissao..."; } } trait Recursos { function CargaDescarga(){ return "Realiza carga e descarga"; } } class Transfer extends Passeios { use Recursos; } $obj = new Transfer; echo $obj->CargaDescarga(); Traits
  43. 43. Ecossistem a
  44. 44. Editores
  45. 45. Editores (IDEs)
  46. 46. • Commits rápidos • Trabalha offline • Todos tem cópia
  47. 47. Controle de versão compartilhado Hospedado • GitHub • BitBucket • Atlassian Stash Servidor próprio • Gitosis • Gitorious • GitLab • GitBlit
  48. 48. Fonte: http://abload.de/img/in_case_of_fireirrtb.jpg
  49. 49. O que seria um build no PHP? • Submeter aos testes (unitário, comportamento e integração) • Executar as migrations • Concatenar e minificar arquivos JavaScript e CSS • Comprimir imagens • Compilar Sass e LESS • Atribuir permissões em arquivos/pastas • Produzir arquivos estáticos, como HTMLs • Agendamentos na CRON • php.ini local x php.ini do servidor x php.ini do CLI • Transformar código de ECMA6 para ECMA5
  50. 50. <?xml version="1.0" encoding="UTF-8"?> <!-- Demonstração de como alterar as credenciais de BD - by Ari Jr. arijunior@gmail.com (25/4/2013)--> <project name="CartridgeMagento" default="principal" basedir="."> <target name="ConfiguraVarAmbiente"> <property name="db_host" value="${env.DBHOST}" override="yes" /> <property name="db_user" value="${env.DBUSER}" override="yes" /> <property name="db_pass" value="${env.DBPASS}" override="yes" /> <property name="db_name" value="${env.DBNAME}" override="yes" /> </target> <target name="principal" depends="ConfiguraVarAmbiente" description="Altera o arquivo de conf. do Magento"> <!-- Copia o template e aplica uma cadeia de filtros --> <copy file="app/etc/local.xml.template" tofile="app/etc/local_outro.xml" overwrite="true"> <filterchain> <replacetokens begintoken="{{" endtoken="}}"> <token key="db_host" value="${db_host}" /> <token key="db_user" value="${db_user}" /> <token key="db_pass" value="${db_pass}" /> <token key="db_name" value="${db_name}" /> </replacetokens> </filterchain> </copy> </target> </project>
  51. 51. IaaS PaaS SaaS OpenShift, Heroku, Google App Engine (Google Cloud), AppFog, Pagoda Box, Fortrabbit, Laravel Forge Digital Ocean, AWS, Linode, Azure, Rackspace, Open Stack Hospedagem: cloud
  52. 52. Implantação: simples, previsível e reversível Foto:https://flic.kr/p/6mNHcj
  53. 53. Deployment •Capistrano http://capistranorb.com •Phing (manual) http://www.phing.info •Rocketeer http://rocketeer.autopergamene.eu •Magallanes http://magephp.com
  54. 54. Testes
  55. 55. Codeception <?php $I = new AcceptanceTester($scenario); $I->wantTo('Me autenticar no sistema'); $I->amOnPage('/login'); $I->fillField('email', 'arijunior@gmail.com'); $I->fillField('senha', 'p@$$w0#d'); $I->click('Entrar'); $I->see('Agenda', 'h1'); ?>
  56. 56. Migrations: Phinx https://phinx.org
  57. 57. Segurança
  58. 58. API para hashing de senha • Converte a senha em um token de uma só via • Haviam bibliotecas separadas para essa finalidade: http://openwall.com/phpass/ • Dificilmente se consegue aplicar engenharia reversa para decifrar a senha original
  59. 59. Funções <?php $pass1 = password_hash("senha", PASSWORD_BCRYPT); echo $pass1; //$2y$10$bi8RpsxOvEt5mdmZRQjPqewPpw5OhRQcIQZWDld3/GDC3t6dL6wFC //Tornando a hash ainda mais difícil de decifrar: //salt (tempero) deve conter 22 caracteres //cost representa o tempo de CPU utilizado. Deve ser de 4 a 31. //Obs. a partir de 10 começa a comprometer significativamente a performance $pass2 = password_hash("senha", PASSWORD_BCRYPT, array('salt'=>'Junicao2k14AriNetoPalo', 'cost'=>8)); echo $pass2; //$2y$11$Junicao2k14AriNetoPalea7XU5I/HU2TBiIy1ISQPliFAawO8ptq • Gera uma hash de 60 caracteres • Constante PASSWORD_BCRYPT representa o algoritmo BlowFish • Constante PASSWORD_BCRYPT_DEFAULT_COST possui 10 como padrão
  60. 60. Mapeamento Objeto Relacional (ORM) • Persistir o objeto numa estrutura de dados relacional • Tradução para tabelas, campos e linhas • ORM mascara detalhes obscuros • Overhead • Requer aprendizagem de outras tencnologias. Ex.: DQL (Doctrine), Propel, Eloquent etc. http://www.edzynda.com/use-laravels-eloquent-orm-outside-of-laravel/
  61. 61. Object-relational mapping
  62. 62. <?php //SELECT * FROM artigos WHERE id=23 $artigo = AppArtigos::find(23); $artigo->titulo = "Apresentando Modern PHP"; $artigo->publicado_em = CarbonCarbon::now(); $artigo->save(); //SELECT * FROM artigos WHERE titulo='Ari' $artigo = AppArtigos::where('titulo', 'Ari')->get(); //SELECT * FROM artigos WHERE assunto='PHP' ORDER BY publicado_em DESC LIMIT 10 $artigo = AppArtigos::where('assunto', 'PHP') ->orderBy('publicado_em', 'desc') ->take(10) ->get(); $artigos = AppArtigos::all(); return $artigos;
  63. 63. HHVM, Hack e PHP7 http://alshain4.deviantart.com/art/Elephant-whisperer-292023268
  64. 64. Facebook • 12.5 milhões de requisições por segundo (tráfego dinâmico!) • 260 milhões de conexões abertas simultaneamente • 1.1 bilhão de usuários ativos/mês Dados extraídos da palestra do gaúcho Marlon Dutra no FISL14 (em julho/2013) intitulada "Facebook: gerenciando tráfego globalmente para atender 1 bilhão de usuários": https://www.youtube.com/watch?v=Sv_xpGzRiOo http://wp.clicrbs.com.br/login/2013/07/05/conheca-marlon-o-gaucho-que-controla-os-numeros-do-facebook/?topo=13,1,1,,11,13
  65. 65. Declaração de tipos <?php declare(strict_types=1); function obterTotal(float $a, float $b) : float { return $a + $b; } obterTotal(2, "Ari"); //Fatal error obterTotal(2.8, "3.2"); //Fatal error obterTotal(2.5, 1); //int(1) muda para float(1.0) e retorna float(3.5)
  66. 66. Tratamento de erros fatais <?php declare(strict_types=1); function soma(int $a, int $b) : int { return $a + $b; } try { $total = soma(3, 5.6); echo $total; } catch (Throwable $e) { echo $e->getMessage(); } finally { echo "Finaliza independentemente"; }
  67. 67. Comunidades
  68. 68. Por onde eu começo? Fonte: http://doc.php.net/revcheck.php
  69. 69. http://vitaly-sokol.deviantart.com/art/An-African-Elephant-Underwater-583948615 Ao infinito e além
  70. 70. Fonte:https://leanpub.com/php • Linha de comando (CLI) • GUI • Daemons • Impressão • Raspberry Pi e Arduino e MUITO mais…
  71. 71. Code Climate https://codeclimate.com
  72. 72. Travis CI www.travis-ci.org .travis.yml
  73. 73. • TeamCity (by JetBrains) www.jetbrains.com/teamcity • Continuous PHP www.continuousphp.com • PHPCI www.phptesting.org • Semaphore www.semaphoreci.com • Scrutinizer www.scrutinizer-ci.com • SensioLabs Insight www.insight.sensiolabs.com • Buildkite www.buildkite.com • Codacy www.codacy.com
  74. 74. Mercado de Trabalho
  75. 75. Fonte: Craigslist em http://www.langpop.com Comparativo de ofertas
  76. 76. "Life" by Edward Monkton
  77. 77. Josh Lockhart PHP do jeito certo: http://br.phptherightway.com Awesome PHP https://github.com/ziadoz/awesome- phpJamie York
  78. 78. AMP
  79. 79. Década passada Hoje
  80. 80. Dicas • Estruturada x Orientada à Objetos • Relacional x NoSQL • Waterfall x Agile • FTP x git push • Equipes remotas • Virtualização • Curriculum Vitae x GitHub | Stack Overflow • Cloud
  81. 81. "Modern PHP development isn't as much about changes in the language as it is about changes in how we build software with PHP." Ben Ramsey
  82. 82. E-mail: arijunior@gmail.com Twitter: @stopassola Skype: stopassola LinkedIn: http://pt.linkedin.com/in/stopassola Facebook: http://www.facebook.com/arijunior Sites: http://slideshare.net/arijunior http://www.perito.inf.br http://www.certificamp.com http://www.rumoacertificacaophp.com Contatos
  83. 83. Obrigado! [ tem brinde ]

×