Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.

Modern PHP

1 012 vues

Publié le

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

Publié dans : Technologie
  • Soyez le premier à commenter

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 ]

×