Felipe Ribeiro, Software Engineer @CarlosFilho15 O processo de geração do opcode é sim um processo de compilação JIT, o código que é interpretado não é o PHP como você escreve, mas sim o opcode que é um código intermediário gerado nessa compilação (como o bytecode de Java).1 year ago
Are you sure you want to
Carlos Filho, Analista de Sistemas at Zoom na WEBNo slide 77 é feita uma referência ao cache opcode do PHP. Como o PHP é uma linguagem interpretada, não há compilação de código. O arquivo fonte é lido e executado toda vez que chamado.
Dessa forma, é incoerente tratar de compilação, pois não é gerado um novo código processado por uma máquina de compilação.
O cache opcode evita que algumas tarefas sejam refeitas a cada execução do código, tornando o processo de tradução mais rápido. Recomendo fortemente a utilização de qualquer ferramenta de opcode, seja xcache, apc, eaccelerator, todas fazem esse papel muito bem e melhoram significativamente a performance da aplicação.
Parabéns pela apresentação, é realmente muito boa!1 year ago
PHP Jedi - Boas Práticas e Alta PerformancePresentation Transcript
php
Jedi
Boas práticas e
alta performance
Felipe Ribeiro
http://feliperibeiro.com
felipernb@gmail.com
quot;PHP is not about purity in CS principles or
architecture; it is about solving the ugly web
problem with an admittedly ugly, but extremely
functional and convenient solution. If you are
looking for purity, you are in the wrong boat. Get
out now before you get hit by a wet cat!quot; -
Rasmus Lerdorf
Beleza nem sempre é
fundamental
Mas um código
bem escrito faz
toda a diferença!
Boas práticas
Evite o
spaghetti
Divida em
camadas
• Para
separar a aparência da lógica de
negócio
• Smarty
• Savant, TinyButStrong, PHPTAL, XSLT, ...
Siga um
padrão de
codificação
exemplo, as convenções do Java:
• Por
• CamelCase
• Classescomeçam com maiúscula:
FrontController, DatabaseConnection,
RestClient
• Variáveis
(atributos), funções (métodos)
começam com minúscula: $user,
$this->name, print(), $this->getName()
• Constantes,toda em maiúscula com
underline para separar palavras:
DATABASE_LOGIN, BASE_DIR
• Existem diversas convenções para PHP
• PEAR Coding Standards
http://pear.php.net/manual/en/
standards.php
• Zend Framework Coding Standard for PHP
http://framework.zend.com/manual/en/
coding-standard.html
Use o PEAR
Use o PEAR
PHP
Extension and
Application
Repository
• Pacotes
escritos por membros ativos da
comunidade PHP
• Tudotestado por um time exigente de
controle de qualidade.
• Gerenciamento “a la apt-get”:
Ex.:
pear install Log
pear upgrade PHPUnit
pear uninstall Text_CAPTCHA
Não reinvente
a roda
• Crie
do zero apenas o que é específico da
sua aplicação
• Reuso de código facilita a manutenção
• Códigosde fontes confiáveis como PEAR e
Zend Framework são bem testados antes
de serem disponibilizados.
Diga não ao
Ctrl + C, Ctrl + V
• Se
o mesmo código precisa ser usado em
mais de um lugar, não copie!
• Encapsule numa função/método
• Ajuda a separar camadas
• Padrões de codificação
• Reaproveitamento de código
• Aprecie com moderação!*
Escolha bons nomes
• Nomes relevantes ajudam no entendimento
do código
com nomes como: $xpto, $foo,
• Variáveis
$bar, etc... não dizem nada sobre o que é
guardado lá (assim como funções, classes
e métodos)
Comente o
código
Comente o
código
Mas comentários não
disfarçam códigos
mal escritos
quot;Don't comment bad
code - rewrite it.quot;
Brian W. Kernighan
and P. J. Plaugher
Keep It Simple,
Stupid!
Keep It Simple,
Stupid!
Evite qualquer
complexidade
desnecessária
Utilize padrões
para se
comunicar
Em alguns
lugares do
oriente
médio, esse
gesto...
seria interpretado assim...
Então é melhor não
inventar!
XML
XML
JSON
JSON
Quebre grandes
blocos de código
em blocos menores
Quebre grandes
blocos de código
em blocos menores
Classes e métodos
muito grandes devem
ser refatorados
Não use Windows
“PHP Windows
developers are
second-class
citizens” –
Rasmus Lerdorf
• Windows não é a plataforma ideal para
desenvolvedores
• Não tem um terminal poderoso
• Não vem “de fábrica” com compiladores
úteis para nós, como o gcc
• Nãoreproduz o ambiente de produção
mais comum em PHP, o LAMP
• Nãotem um gerenciador de pacotes que
permita atualizar e adicionar/remover
módulos do PHP de maneira trivial.
• Não
tem um bom gerenciamento de
memória.
• Dêuma chance ao Linux ou algum sabor
de Unix (FreeBSD, Mac OS X, etc...)
Tratamento
de erros
Tratamento
de erros
Desenvolva
no modo
E_STRICT
Tratamento
de erros
Desenvolva
no modo Use
E_STRICT Exceptions
e trate-as
display_errors = off
Afinal o usuário não
vai depurar o seu
código
Não use o operador
@ para suprimir
erros. Atrapalha o
debug e deixa a
execução mais lenta
Não confie
no usuário
Não confie
no usuário
filtre toda
entrada
e escape
toda saída
Use o
Twitter para
algo útil
Crie um perfil
privado para a
sua aplicação
Crie um perfil
privado para a
sua aplicação
onde os únicos
followers são os
desenvolvedores
Utilizando a API,
faça com que sua
aplicação dê uma
“twittada” a cada
erro
Performance e
Escalabilidade
Performance
Performance
a habilidade que uma
aplicação tem de atingir um
objetivo, como por exemplo
responder no menor tempo
possível
Escalabilidade
Escalabilidade
a habilidade de uma aplicação
manter a performance quando
a carga de trabalho aumenta.
PHP não
é tão
rápido...
Porém sua
arquitetura
share-nothing
simplifica a
escalabilidade
E PHP
dificilmente
é o gargalo
A maior parte do
tempo é gasto no
banco de dados ou
com o carregamento
do front-end
Sempre dá para
espremer e melhorar
Xdebug
arrebenta no
profiling!
• Instale a extensão Xdebug
a opção xdebug.profiler_enable
• Habilite
caso queira que toda execução gere o log
• Ou a opção
xdebug.profiler_enable_trigger para que
o log só seja gerado quando você passar
?XDEBUG_PROFILE na URL
• Rode o script que você quer analisar
• Abra
o log gerado pelo Xdebug no
KCacheGrind caso use Linux, ou no
WebGrind em qualquer outra plataforma.
KCacheGrind
http://code.google.com/p/webgrind/
• xdebug_memory_usage( ) diz quanto de
memória o script está usando no momento
da chamada
• xdebug_peak_memory_usage( ) diz qual o
valor máximo de memória que foi usada
durante a execução
Testes
de carga
Testes
de carga
ApacheBench (ab)
Siege - www.joedog.org
Macintosh:~ felipe$ ab -c 10 -t 30 -b -k 'http://shoprizer.localhost/'
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking shoprizer.localhost (be patient)
Finished 4379 requests
Server Software: Apache/2.0.59
Server Hostname: shoprizer.localhost
Server Port: 80
Document Path: /
Document Length: 22320 bytes
Concurrency Level: 10
Time taken for tests: 30.010 seconds
Complete requests: 4379
Failed requests: 0
Write errors: 0
Total transferred: 99436344 bytes
HTML transferred: 97806240 bytes
Requests per second: 145.92 [#/sec] (mean)
Time per request: 68.532 [ms] (mean)
Time per request: 6.853 [ms] (mean, across all concurrent requests)
Transfer rate: 3235.74 [Kbytes/sec] received
Macintosh:~ felipe$ siege -b -t30s 'http://shoprizer.localhost/'
** SIEGE 2.67
** Preparing 10 concurrent users for battle.
The server is now under siege...
Lifting the server siege... done.
Transactions: 4909 hits
Availability: 100.00 %
Elapsed time: 29.84 secs
Data transferred: 104.49 MB
Response time: 0.06 secs
Transaction rate: 164.51 trans/sec
Throughput: 3.50 MB/sec
Concurrency: 9.93
Successful transactions: 4909
Failed transactions: 0
Longest transaction: 2.28
Shortest transaction: 0.00
Caching
APC
Faz cache do opcode do
PHP. Evitando que seja
recompilado a cada
execução
APC
Faz cache do opcode do
PHP. Evitando que seja
recompilado a cada
execução
Também permite fazer
cache de informações em
memória
APC
<?php
$valor = 'Informação que quero armazenar';
//Armazena o valor no cache em memória do APC
apc_store('id_da_informacao', $valor);
// O valor pode ser recuperado em diferentes
scripts através do apc_fetch
var_dump(apc_fetch('id_da_informacao'));
?>
Memcached
Memcached
É necessária a execução
de um daemon
Memcached
É necessária a execução
de um daemon
Ideal para objetos pequenos
Memcached
<?php
$memcache = new Memcache();
//Conecta no servidor memcached
$memcache->connect('localhost', 11211);
$valor = 'Informação que quero armazenar';
//Envia via socket a informação para o memcached
$memcache->set('id_da_informacao', $valor);
//Recupera a informação
var_dump($memcache->get('id_da_informacao'));
?>
Smarty
Além de separar lógica
e visualização, faz
caching
Smarty
<?php
require 'smarty/Smarty.class.php';
$id = (int) $_GET['id'];
$smarty = new Smarty();
$smarty->caching = 1;
if(!$smarty->is_cached('noticia.tpl',$id)) {
//Carrega do banco de dados
}
$smarty->display('noticia.tpl',$id);
?>
Frameworks
(de novo? Já vi esse slide!)
• Frameworks ajudam em aplicações com
funcionalidades comuns.
• Ascamadas genéricas de um framework
acabam gerando overhead.
• Na necessidade de alta performance, você
vai precisar abrir mão de certos “luxos”
para ter mais flexibilidade e fazer o tunning.
Armazenamento
em MySQL
Armazenamento
em MySQL
Performance é
com MyISAM
Integridade é
com InnoDB
Simple is Hard
•
Rasmus Lerdorf - http://talks.php.net/show/lca09
Building Scalable Web Sites
•
Cal Henderson - O’Reilly Media, Inc. 2006
Desenvolvendo aplicações Web escaláveis
•
Elton Minetto - http://www.eltonminetto.net/docs/
app_web_escalaveis.pdf
Scalable PHP
•
Cal Henderson - http://www.slideshare.net/iamcal/scalable-php-
presentation
Dessa forma, é incoerente tratar de compilação, pois não é gerado um novo código processado por uma máquina de compilação.
O cache opcode evita que algumas tarefas sejam refeitas a cada execução do código, tornando o processo de tradução mais rápido. Recomendo fortemente a utilização de qualquer ferramenta de opcode, seja xcache, apc, eaccelerator, todas fazem esse papel muito bem e melhoram significativamente a performance da aplicação.
Parabéns pela apresentação, é realmente muito boa! 1 year ago
Acho que não foi gravada a apresentação, se tem eu nunca vi :(
Mas é só convidar que eu apresento em Maceió! :D
[ ]s 3 years ago