Post on 07-Apr-2017
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
Popularidadehttp://w3techs.com/technologies/overview/programming_language/all
+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
Outros padrões recomendados
• PSR-3 Logger Interface• PSR-4 Autoloading Standard• PSR-6 Caching Interface• PSR-7 HTTP Message Interface
Componentes
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
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');?>
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…
Travis CIwww.travis-ci.org
.travis.yml
• 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
E-mail:arijunior@gmail.com
Twitter: @stopassolaSkype: stopassolaLinkedIn:
http://pt.linkedin.com/in/stopassola
Facebook:http://www.facebook.com/arijunior
Sites:http://slideshare.net/arijuniorhttp://www.perito.inf.brhttp://www.certificamp.com http://www.rumoacertificacaophp.com
Contatos
Obrigado![ tem brinde ]