Download - Modern PHP

Transcript
Page 1: Modern PHP

Modern PHPAri Stopassola Junior

Page 2: Modern PHP

20 anoshttp://haphpy-birthday.net

https://plus.google.com/115682389249477476280/posts

Page 3: Modern PHP

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/

Page 4: Modern PHP

História

Page 5: Modern PHP
Page 7: Modern PHP

+82% de TODA a internet usa PHP

Page 8: Modern PHP

Renascimento

https://pt.wikipedia.org/w

iki/Homem

_Vitruviano_%28desenho_de_Leonardo_da_Vinci%

29

Page 9: Modern PHP

Framework Interoperability Group

Page 10: Modern PHP

PSRPHP Standards

Recommendations http://www.php-fig.org/psr/

Page 11: Modern PHP

PSR-1http://www.php-fig.org/psr/psr-1/

<?phpnamespace Agencia\Receptivo;

class ItinerarioDePasseio{ const IDADE_MIN = 5; public function montaRoteiro() { } }

<?php ou <?= ?>Namespac

es

StudlyCaps

MAIÚSCULAS camelCa

se

Page 12: Modern PHP

PSR-2http://www.php-fig.org/psr/psr-2/

<?phpnamespace Agencia\Receptivo;

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

Page 13: Modern PHP
Page 14: Modern PHP

Coding Standardshttp://pear.php.net/package/PHP_CodeSniffer

Instalação:pear install PHP_CodeSnifferouapt-get install php-codesniffer (Linux)

phpcs hello.php

phpcs --standard=zend hello.php

Page 15: Modern PHP

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

Page 16: Modern PHP

Boas práticas

vão além...

Page 17: Modern PHP

• 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

Page 18: Modern PHP

QA: quality assurancehttp://phpqatools.org

Page 19: Modern PHP

Outros padrões recomendados

• PSR-3 Logger Interface• PSR-4 Autoloading Standard• PSR-6 Caching Interface• PSR-7 HTTP Message Interface

Page 20: Modern PHP

Componentes

Page 21: Modern PHP
Page 22: Modern PHP

Gestor de dependências para PHP

http://getcomposer.org

Page 23: Modern PHP

Packagist: repositório de pacoteshttps://packagist.org

php composer.phar require phpoffice/phpword

https://packagist.org/statistics

Page 24: Modern PHP

<?phprequire "vendor/autoload.php";$mail = new PHPMailer;$mail = null;

$pdf = new \fpdf\FPDF();$pdf->output("documento.pdf", "F");$pdf = null;

use PhpOffice\PhpWord\PhpWord;$doc = new PhpWord;$doc->save("documento.doc", 'Word2007');

use Intervention\Image\ImageManagerStatic as Image;$img = Image::make('IMG_8529.JPG');$img->resize(50, 50);$img->save('miniatura.jpg');

Page 25: Modern PHP

Instalação de componentes

curl -sS https://getcomposer.org/installer | phpphp composer.phar require phpmailer/phpmailerphp composer.phar require itbz/fpdfphp composer.phar require phpoffice/phpwordphp composer.phar require intervention/image

compos

er.json

Page 26: Modern PHP

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

Page 27: Modern PHP

Documentação

Page 28: Modern PHP

Documentação• Faz parser do código em busca de DocBlocks

• Auto-documentação• Converte em HTML, PDF, CHM e XML (DocBook)

• phpDocumentorhttp://www.phpdoc.org

• DocBloxhttp://www.docblox-project.org

• Doxygenhttp://www.doxygen.org

• PHP Doxhttp://phpdox.net/

Page 29: Modern PHP

phpdoc -t docs/ -o PDF:default:default -d .

Diretório local

Page 30: Modern PHP

Frameworks

Page 31: Modern PHP

“They all suck!”Rasmus Lerdorf – PHP Frameworks Day

2013

Page 32: Modern PHP

I'm kidding!

Page 33: Modern PHP

Life is full of choices...

Page 34: Modern PHP

Frameworks full-stack

Page 35: Modern PHP

Fonte: http://microphp.org

Page 36: Modern PHP

Provisionamentowww.phansible.com

Page 37: Modern PHP

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• Gera overhead: consome mais recursos

Page 38: Modern PHP

Otimização

Page 39: Modern PHP

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)

Page 40: Modern PHP

Profiler: KCachegrind

Page 41: Modern PHP

Profiler: webgrindhttps://github.com/jokkedk/

webgrind

Page 42: Modern PHP

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)

Page 43: Modern PHP

Lab: ApacheBenchab -n 100 -c 5 http://www.site.com/

Compare com e sem Opcache, onde diz: Time taken for tests

Page 44: Modern PHP

Cenário…Nesse caso o método CargaDescarga (também útil na classe Transfer) deverá ser copiado

Page 45: Modern PHP

<?phpclass 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

Page 46: Modern PHP

Ecossistema

Page 47: Modern PHP

Editores

Page 48: Modern PHP

Editores (IDEs)

Page 49: Modern PHP
Page 50: Modern PHP

• Commits rápidos

• Trabalha offline• Todos tem cópia

Page 51: Modern PHP

Controle de versão compartilhado

Hospedado• GitHub• BitBucket• Atlassian

Stash

Servidor próprio

• Gitosis• Gitorious• GitLab• GitBlit

Page 52: Modern PHP

Fonte: http://abload.de/img/in_case_of_fireirrtb.jpg

Page 53: Modern PHP

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

Page 54: Modern PHP
Page 55: Modern PHP

<?xml version="1.0" encoding="UTF-8"?><!-- Demonstração de como alterar as credenciais de BD - by Ari Jr. [email protected] (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>

Page 56: Modern PHP

IaaSPaaSSaaS

OpenShift, Heroku, Google App Engine (Google Cloud), AppFog, Pagoda Box, Fortrabbit, Laravel Forge

Digital Ocean, AWS, Linode, Azure, Rackspace, Open Stack

Hospedagem: cloud

Page 57: Modern PHP

Implantação: simples, previsível e reversível

Foto

: http

s://

flic.

kr/p

/6m

NHc

j

Page 58: Modern PHP

Deployment• Capistranohttp://capistranorb.com

• Phing (manual)http://www.phing.info

• Rocketeerhttp://rocketeer.autopergamene.eu

• Magallaneshttp://magephp.com

Page 59: Modern PHP
Page 60: Modern PHP

Testes

Page 61: Modern PHP

Codeception<?php$I = new AcceptanceTester($scenario);$I->wantTo('Me autenticar no sistema');$I->amOnPage('/login');$I->fillField('email', '[email protected]');$I->fillField('senha', 'p@$$w0#d');$I->click('Entrar');$I->see('Agenda', 'h1');?>

Page 62: Modern PHP
Page 63: Modern PHP

Migrations: Phinxhttps://phinx.org

Page 64: Modern PHP

Segurança

Page 65: Modern PHP

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

Page 66: Modern PHP

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

Page 67: Modern PHP

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

p://

ww

w.e

dzyn

da.c

om/u

se-la

rave

ls-el

oque

nt-o

rm-o

utsid

e-of

-lara

vel/

Page 68: Modern PHP

Object-relational mapping

Page 69: Modern PHP

<?php//SELECT * FROM artigos WHERE id=23$artigo = App\Artigos::find(23);$artigo->titulo = "Apresentando Modern PHP";$artigo->publicado_em = Carbon\Carbon::now();$artigo->save();

//SELECT * FROM artigos WHERE titulo='Ari'$artigo = App\Artigos::where('titulo', 'Ari')->get();

//SELECT * FROM artigos WHERE assunto='PHP' ORDER BY publicado_em DESC LIMIT 10$artigo = App\Artigos::where('assunto', 'PHP') ->orderBy('publicado_em', 'desc') ->take(10) ->get();

$artigos = \App\Artigos::all();return $artigos;

Page 70: Modern PHP

HHVM, Hack e PHP7

http://alshain4.deviantart.com/art/Elephant-w

hisperer-292023268

Page 71: Modern PHP

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:

//w

p.cl

icrb

s.com

.br/

logi

n/20

13/0

7/05

/con

heca

-mar

lon-

o-ga

ucho

-que

-con

trol

a-os

-num

eros

-do-

face

book

/?to

po=1

3,1,

1,,1

1,13

Page 72: Modern PHP
Page 73: Modern PHP
Page 74: Modern PHP
Page 75: Modern PHP
Page 76: Modern PHP
Page 77: Modern PHP
Page 78: Modern PHP
Page 79: Modern PHP
Page 80: Modern PHP

Declaração de tipos<?phpdeclare(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)

Page 81: Modern PHP

Tratamento de erros fatais

<?phpdeclare(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";}

Fatal

error

Page 82: Modern PHP

Comunidades

Page 83: Modern PHP
Page 84: Modern PHP

Por onde eu começo?

Fonte: http://doc.php.net/revcheck.php

Page 85: Modern PHP
Page 86: Modern PHP

http://vitaly-sokol.deviantart.com/art/An-African-Elephant-U

nderwater-583948615

Ao infinito e além

Page 87: Modern PHP

Fonte: https://leanpub.com/php

• Linha de comando (CLI)

• GUI• Daemons• Impressão• Raspberry Pi e

Arduinoe MUITO mais…

Page 88: Modern PHP

Code Climatehttps://codeclimate.com

Page 90: Modern PHP

• TeamCity (by JetBrains)www.jetbrains.com/teamcity

• Continuous PHPwww.continuousphp.com

• PHPCIwww.phptesting.org

• Semaphorewww.semaphoreci.com

• Scrutinizerwww.scrutinizer-ci.com

• SensioLabs Insightwww.insight.sensiolabs.com

• Buildkitewww.buildkite.com

• Codacy www.codacy.com

Page 91: Modern PHP

Mercado de

Trabalho

Page 92: Modern PHP

Fonte: Craigslist em http://www.langpop.com

Comparativo de ofertas

Page 93: Modern PHP

"Life" by Edward Monkton

Page 94: Modern PHP

Josh Lockhart

PHP do jeito certo:http://br.phptherightway.com

Awesome PHPhttps://github.com/ziadoz/awesome-php Jamie York

Page 95: Modern PHP

AMP

Page 96: Modern PHP

Década passada

Hoje

Page 97: Modern PHP

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

Page 98: Modern PHP

"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

Page 100: Modern PHP

Obrigado![ tem brinde ]


Top Related