O documento resume a história e evolução da linguagem de programação PHP. Em 3 frases:
PHP começou como um conjunto de scripts criados por Rasmus Lerdorf em 1994 para gerenciar seu site pessoal. Ao longo dos anos, tornou-se uma das linguagens de programação mais populares da internet devido à sua simplicidade e capacidade de criar aplicações web dinâmicas. Atualmente, o PHP é usado por mais de 82% dos sites da web e continua se desenvolvendo com novos recursos, padrões e frameworks para ser ainda mais poderoso e flexível.
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/
15. 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
26. 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
28. 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/
37. 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
39. 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)
42. 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)
43. Lab: ApacheBench
ab -n 100 -c 5 http://www.site.com/
Compare com e sem Opcache, onde diz:
Time taken for tests
44. Cenário…
Nesse caso o método CargaDescarga
(também útil na classe Transfer) deverá
ser copiado
✗
45. <?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
53. 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
54.
55. <?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>
56. 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
65. 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
66. 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
67. 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/
69. <?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;
70. HHVM, Hack e PHP7
http://alshain4.deviantart.com/art/Elephant-whisperer-292023268
71. 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
72.
73.
74.
75.
76.
77.
78.
79.
80. 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)
Php|tek de 2009 os líderes dos principais frameworks se encontraram.
Basic Code StyleBasic Coding Standard
Coding Style Guide
Tela do editor Coda (Panic) for Mac, só para ilustração
http://pear.php.net/manual/pt_BR/package.php.php-codesniffer.coding-standard-tutorial.phpPode checar outros formatos além do PHP, com por exemplo JS e XML.
Garantia de qualidade
Autoload mudou significativamente a forma de desenvolver aplicações. Antes da versão 5, era necessário fazer include/require em cada arquivos de classes que desejava incorporar.
Introduziu-se o __autoload();
PEAR: PHP Extension and Application Repository
PEAR são classes em PHP (incluídas no código), enquanto que PECL são extensões escritas em C
Instala pacotes num repositório central
Requer privilégios de administrador/root
Estagnada
Força a qualidade de código com inúmeras regras.
Mais moderno que os demais
Diferentes estratégias de autocarregamento: PSR-0, PSR-4, classpath, files…
composer.json
composer.lock
vendor (diretório)
A medida que a funcionalidade aumenta, mais prefixos são adicionados, deixando os nomes extremamente grandes e consequentemente difícil de manusear.
Compilação do conteúdo, mapas mentais, sínteses.
pear install PhpDocumentorConverte para HTML, PDF e CHM (windows help files)Define os “DocBlocks”
phpdoc -t docs/ -o PDF:default:default -d .
-t é o target, -d diretório que sofrerá o parserpara mais informações acesse:vim /Applications/MAMP/bin/php/php5.3.6/lib/php/data/PhpDocumentor/phpDocumentor.ini
Se aparecer um “ERROR: nothing parsed” verifique o local onde você se encontra.
phpdoc -t docs/ -o HTML:frames:phpedit -d .
https://www.youtube.com/watch?v=anr7DQnMMs0#t=1904
Aproximadamente aos 31m 47s de palestra.
Espelhamento de ambientes.Qual a imagem usar, que script Chef executar, habilitar rede, pastas compartilhadas.
Com uma linha é possível testar em diferentes versões de sistema operacional e combinações de configuração.
Usa Hyper-V (Microsoft), VirtualBox (Oracle), KVM, VMWare etc.Orientado a ambientes de desenvolvimento, pois utilizam uma camada de vitualização – prejudicando a performance.Criar um ambiente que possa ser reproduzido, quando se precisa de algo que fuja do LAMP, compatibilidade cross-platform, time trabalhando em diferentes SO. Provisionamento: setup automatizado, quanto tempo para subir uma máquina, maximizar dev/prod parity, isolamento de ambientes,
https://pt.wikipedia.org/wiki/Brian_Kernighan
Usar a intuição, remover partes e testar. Arquivos Cachegrindxdebugtoolkit é escrito em Python e o CachegrindVisualizer é Adobe Air (multiplataforma).
Para utilizar em modo trigger, passe como parâmetro na URL o XDEBUG_PROFILE=1
cachegrind.out.%p (process ID)
%t (timestamp) e %R (raiz) Ex.: cachegrind.out.1370217130-_LiveDemoxDebug_funcoes_inc_php_XDEBUG_PROFILE=1
Instalando o KCacheGrind via MacPort:
sudo port install kcachegrind
kcachegrind (para executar a aplicação)
xdebug.max_nesting_level = 4 impacta na execução do WebGrindMostrar 100% e em microsegundos.
Teste no WordPress para ter resultados mais expressivos.
Pode-se utilizar um álias com AS
function NomeDoNamespace(){
return "Namespace é: ".__NAMESPACE__."<br />";
}
Ferramentas
WYSIWYG, suporte a BD, inspeção de classes (para saber que métodos oferecem)
Eclipse PDT (PHP Developer Tools). Os “genéricos” deve escolher a perspectiva PHP.phpStorm
Excelente exercício:http://www.codeschool.com/courses/try-git
O Linux utilizava o BitKeeper (que é um software comercial)Conhecido como um “Filesystem distribuiído”
Gitosis e Gitorious pode-se baixar e instalar num servidor local. Através de um servidor, é possível ter maior controle sobre os dados.Existe também o Garrit e outros...
Habilitar SSL (Certificação digital) nos servidores, gerar documentação, Stress test: Apache Bench e SeigeECMAScript 5 é mais compatível.
Abra o terminal:sudo pear install http://phing.info/pear/phing-current.tgz
Testando se foi realmente instalado:phing –v
Deve aparecer algo como: "Phing version 2.1.1"
Siga esse mantra
Simples: procure concentrar o processo de implantação e dispará-lo em apenas UM comando.
Previsível : saber o que está acontecendo. Se houver efeitos colaterais, mantenha a versão corrente.
Reversível: UM comando e o sistema volta ao que era.
Phing é baseado no Apache Ant.
Workflow bastante utilizado
Testes funcionais usam PhpBrowser, enquanto que os testes de aceitação rodam através do PhantomJS
Testes de aceitação (Codeception) são mais proveitosos para times pequenos. Emulam a navegação no site/sistema, experimentando o funcionamento como um todo.
Segurança
print_r(get_defined_constants()); //para exibir todas as constantes pré-definidas
Memcache quando o conteúdo é o mesmo, independente de servidor.Facebook tem 805 servidores em memcache, do total de 10 mil (fizeram um fork do projeto, com suporte a UDP) – dados de 2008.Flickr – 38mil requisições/segMemcache integra com Nagios
Gearman pode rodar de forma síncrona (em primeiro plano) ou assíncrona (em background). Digg possui 400 mil jobs por dia
Experimente fazer um left outer join num ORM, ou uma função de agregação como média. Alguns falharam ao executar transações, passando a responsabilidade para a aplicação.Não há necessidade de cache, pois o mongoDB já fica em memório – o quanto houver de RAM disponível.Usar monboDB simplifica o desenvolvimento da aplicação pois não requer tratar de atualizações de registros, cache expirado etc.
Hibernate do Java e ao ActiveRecord do Rails. Mapeamento em arquivos .ini ou XMLPropel e Doctrine usam o design pattern ActiveRecord, enquanto que o Zend_Db_Table usa Table Data Gateway pattern e Row Data Gateway pattern.
Livro "Patterns of Enterprise Application Architecture" do Martin Fowler de 2003.
Patrick Shuffhttps://www.youtube.com/watch?v=MKgJeqF1DHwhttp://investor.fb.com/releasedetail.cfm?ReleaseID=893395
Criado pelo FacebookGerou competição
Dialeto do PHP (e não uma linguagem totalmente nova)
Por que pularam o PHP6?
http://www.zend.com/en/resources/php7_infographicTempo de execução quase 2 vezes mais rápido que o PHP 5.6 e 30% a menos de consumo de memória, suporta 3x mais requisições que um servidor rodando PHP 5.6.
http://www.zend.com/en/resources/php7_infographicDrupal 8 roda 72% mais rápido com PHP7
http://www.zend.com/en/resources/php7_infographic25% dos sites no mundo rodam em WordPress
Aceita int, bool, string e float (scalar). O TypeHint tradicional funciona com objetos e arrays.
Declare é habilitado por aquivo e não no php.ini (para todos). Antes do PHP7 fazia-se muitos testes unitários para checar o tipo de variável.
Pode usar híbrido.
Throwable é uma interface que a Exception e a classe Error implementam. Erros fatais chamam especificamente a Error. Error é a classe pai de TypeError, ParseError, ArithmeticError e AssertionError.
Usa a GIMP Tool Kit para aplicações gráficas desktop, suporte a skin (tema), orientada a eventos, janelas, acesso aos recursos da máquina no cliente, suporte a Widget (caixas de texto, botão, frame etc). Ex.: GNUTeca da Univates, Agata Report.
Issue tracking: Jira é comercial, mas integra com metodologias ágeis (através de plug-in). Trac é feito em Python.
One time now (da Axosoft), porém mais focado em Scrum.Ele não permitia dois responsável por uma tarefa (princípio fundamental do Pair programming – XP).Target Process, Mantis, BugzillaÉ possível agrupar as tarefas realizadas (“Done”) em uma release específica e automaticamente o Jira retira do dashboard.
Ele confronta o código com uma série de ferramentas de QA: http://phpqatools.orgSumariza a saida das principais ferramentas de qualidade. Roda uma série de análises.Métricas.Faz revisão do código, atribui badges (selos) onde a nota 4 é a máxima,
Antecipar gargalos e problemas ANTES de colocar em produção. Progresso incremental.
É possível realizar o commit e evitar o disparo do CI. Ex.: git commit –m "mensagem [CI SKIP]"http://docs.travis-ci.com/user/languages/php/
Jenkins, Travis, GitLab CI, Bamboo, Liquibase, TeamCity e Code Climate.
Mercado de trabalho
Livro lançado em fevereiro/2015.
Apacha está sendo substituído pelo NGINX
Faltou visualizar os arquivos ocultos. Ex.: .gitignore, .env etc.
Workers (mecanismo de filas como ActiveMQ), Querys SQL x MapReduce.
Recomenda-se autenticar via par de chaves, ao invés de login/senha.Karma Level.Arquitetura de cloud: IaaS x Paas- Exexmplos de IaaS: Digital Ocean, AWS, Linode, Azure, Rackspace e Open Stack
- Exemplos de PaaS: OpenShift, Heroku, Google App Engine (Google Cloud), AppFog, Pagoda Box, Fortrabbit, Laravel Forge