modern php

Post on 07-Apr-2017

719 Views

Category:

Technology

2 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Modern PHPAri Stopassola Junior

20 anoshttp://haphpy-birthday.net

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

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/

História

+82% de TODA a internet usa PHP

Renascimento

https://pt.wikipedia.org/w

iki/Homem

_Vitruviano_%28desenho_de_Leonardo_da_Vinci%

29

Framework Interoperability Group

PSRPHP Standards

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

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

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

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

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

Boas práticas

vão além...

• 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

QA: quality assurancehttp://phpqatools.org

Outros padrões recomendados

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

Componentes

Gestor de dependências para PHP

http://getcomposer.org

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

php composer.phar require phpoffice/phpword

https://packagist.org/statistics

<?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');

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

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

Documentação

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/

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

Diretório local

Frameworks

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

2013

I'm kidding!

Life is full of choices...

Frameworks full-stack

Fonte: http://microphp.org

Provisionamentowww.phansible.com

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

Otimização

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)

Profiler: KCachegrind

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

webgrind

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)

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

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

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

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

Ecossistema

Editores

Editores (IDEs)

• Commits rápidos

• Trabalha offline• Todos tem cópia

Controle de versão compartilhado

Hospedado• GitHub• BitBucket• Atlassian

Stash

Servidor próprio

• Gitosis• Gitorious• GitLab• GitBlit

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

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

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

IaaSPaaSSaaS

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

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

Hospedagem: cloud

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

Foto

: http

s://

flic.

kr/p

/6m

NHc

j

Deployment• Capistranohttp://capistranorb.com

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

• Rocketeerhttp://rocketeer.autopergamene.eu

• Magallaneshttp://magephp.com

Testes

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');?>

Migrations: Phinxhttps://phinx.org

Segurança

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

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

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/

Object-relational mapping

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

HHVM, Hack e PHP7

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

hisperer-292023268

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

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)

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

Comunidades

Por onde eu começo?

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

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

nderwater-583948615

Ao infinito e além

Fonte: https://leanpub.com/php

• Linha de comando (CLI)

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

Arduinoe MUITO mais…

Code Climatehttps://codeclimate.com

• 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

Mercado de

Trabalho

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

Comparativo de ofertas

"Life" by Edward Monkton

Josh Lockhart

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

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

AMP

Década passada

Hoje

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

"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

Obrigado![ tem brinde ]

top related