PHP use o que já está pronto

Standard

Analisando ambientes de desenvolvimento, como parte das minhas funções de consultor, a frase mais comum que ouço é: Resolvemos fazer aqui mesmo para ter controle total do código. Sempre que escuto isso entendo: Temos tempo e dinheiro para gastar e não nos preocupamos com desempenho.

ORM: symfony and propel
 photo credit: Andréia

O PHP é a linguagem de programação mais utilizada no momento. Possui centenas de milhares de bibliotecas e frameworks prontos para uso. Testadas em milhões de sites, todos os dias, por milhões de usuários e milhares de desenvolvedores. Algumas delas são desenvolvidas e mantidas pelas maiores empresas do mundo (Oracle, Microsoft, Yahoo! e Google, entre outras). Só existe uma razão para você fazer novamente. Ter muito dinheiro para jogar fora.

Existe uma forma de saber se você realmente precisa desenvolver algo do zero ou pode usar algo que já existe. Na verdade é muito simples. Faça assim: Sempre que for desenvolver uma nova funcionalidade, substitua o a funcionalidade por Windows e veja se faz sentido. Por exemplo: Suponha que você quer desenvolver uma função para girar uma imagem 180 graus. Você diria: Precisamos desenvolver uma função para rodar imagens para ter total controle do código. Substitua função para rodar imagens por o Windows e veja se faz algum sentido. Se fizer, você descobriu uma razão para desenvolver do zero. Se não fizer está só se enganando e perdendo tempo.

Por regra, se for começar um projeto do zero, não faça isso. Use um framework. Os frameworks são conjuntos de objetos com centenas de funcionalidades já prontas para economizar tempo e dinheiro e resolvem praticamente todos os problemas irritantes do dia-a-dia que não têm relação com as regras de negócio que farão o seu aplicativo importante.

A escolha de um framework não é fácil. Eu sugiro três que merecem sua atenção o Yii, simplesmente por ser o mais fácil para o uso do jQuery, o CodeIgniter, que tem a menor curva de aprendizado e o Zend,  que ainda têm um longo caminho pela frente, mas, é desenvolvido pela Zend.  Não se engane, em qualquer um dos casos, você terá que estudar o framework e aprender a utilizá-lo.

Dicas para aumentar a performance do seu código PHP

Standard

Ontem falamos de integração continuada em PHP. Hoje vamos ver algumas dicas de como tornar seu código mais eficiente e rápido. Não adianta ter o melhor código do mundo se ele não for rápido. Na web, considere 2s como o tempo máximo, em condições extremas, para a carga de qualquer página. Antes que comecem as críticas, sei que a infraestrutura conta que a otimização do DB conta que o clima e a fase da Lua também contam, mas, aqui, vamos falar apenas do quê podemos fazer durante o desenvolvimento.

Phillip : male ballet dancer catches the sun
 photo credit: tibchris

xDebug trata-se de uma biblioteca para correção de erros e avaliação de performance para o PHP. Integra muito bem com o Aptana Studio, Eclipse e outras IDEs. Além de permitir coisas como brake e watch, possui uma função de profile que gera um relatório dos tempos gastos com as funções, loops, ifs e etc… dos seus scripts. Usando o KCacheGrind para o KDE e o WinCacheGrind para o Windows, você pode analisar estes relatórios de desempenho de forma gráfica. É possível também, criar um script com o Phing para analisar o relatório de desempenho e incluir este relatório na saída do processo de integração continuada. Além do xDebug, temos o Benchmark, DBG e Advanced PHP Debugger.

Use a versão estável mais nova do PHP. Todas as versões, sem exceção, incluem correções que melhoram o desempenho do código executado. Então migre seu código para a versão mais nova. Em muitos casos esta migração é indolor. Em alguns pode ser fatal. Caberá a você estudar os problemas e decidir como migrar.

Setters e getters: Eu sei, seu professor ensinou assim. Mas, isso não é desculpa para você continuar a fazer setters e getters que simplesmente armazenam o argumento do método. Então, de hoje em diante, nenhum código seu terá uma coisa assim:

[php]
class cliente {
public $nome = ”;

public function setNome($nome) {
$this->nome = $nome;
}

public function getNome() {
return $this->nome;
}
}[/php]

Variáveis Locais: O PHP possui um conjunto de variáveis que facilitam o trabalho com os argumentos passados por um script para outro, em formato de array, como o $_POST e $_GET, por exemplo. Então, agora que você já é um programador crescidinho, não vai carregar uma variável local só para o código ficar mais bonitinho, combinado?

Use include() e require() em lugar de include_once() e require_once(). Durante a execução, estas duas últimas requerem muito mais tempo de processamento, memória e recursos.

Desenvolva com error_reporting(E_ALL), cada warning emitido significa um incremento possível do desempenho do seu código. Resolva todos os warnings. Acredite, eles não estão ali porque os desenvolvedores do PHP são abusivos.

Não use aspas duplas: Alguns vão discordar, mas, a verdade é que cada string entre aspas duplas deverá ser analisada para verificar se contém variáveis que deverão ser substituídas ou não. Se o programador fizer isto em um loop é caso para eutanásia.

Use as funções do PHP: O PHP tem milhares de funções prontinhas, testadas, otimizadas e corrigidas ao longo dos anos por milhares de desenvolvedores. Eu sei que você é o melhor programador do mundo e pode fazer melhor mas, apenas em consideração ao trabalho deles, use as funções predefinidas.

Use echo em lugar de print: Durante a execução do echo, o PHP não espera nenhum retorno, enquanto no print ele aguarda um. Se seu sistema tem dez usuários por dia não faz diferença, se ele tem dez milhões faz. Então, mesmo que esteja em uma pequena empresa hoje, já faça certo. Amanhã você pode estar trabalhando no Yahoo!

Faça o profiling: Comecei e termino por aqui. Faça o Profile! Não é difícil encontrar queries SQL em loops (passa despercebido) e acabamos chamando o DB dez mil vezes seguidas para montar uma tabela que poderia ser montada com um único query; Ou encontrar variáveis sendo definidas a cada iteração; Ou ainda, strings sendo avaliadas centenas de milhares de vezes só para incluir o valor de uma variável.

Por fim lembre-se, levou mais de 2s para carregar toda a página, não está pronto, nem bom e muito menos razoável. Se o problema não for seu, for do analista do banco de dados, por exemplo, reclame, incomode, aborreça. O desempenho é responsabilidade de todos, mas, são os programadores que devem gritar primeiro.

Integração continuada em php

Standard

Depois de algum tempo sem escrever sobre desenvolvimento web resolvi fazer uma pequena série de artigos para realizar uma experiência com meus alunos. O primeiro é este: Integração contínua (ou integração continuada) em PHP.

Will code for food
photo credit: pvera

Integração contínua é uma daquelas coisas que todo mundo sabe o que é, mas ninguém sabe explicar. Aqui e agora, vamos entender isto como sendo: Uma série de operações automatizadas, a serem realizadas sobre o código, antes da entrega final, de forma contínua e constante. Bonito? Em outras palavras, vamos automatizar o processo de entrega, verificação, padronização, controle de versão e documentação do código para que os pobres programadores possam ficar concentrados em programar.  Melhorou?

Começaremos como Xinc (http://code.google.com/p/xinc/) trata-se de um servidor de integração continuada. Ele já é integrado com o Subversion (http://tigris.subversion.org) para controle de versão, com o Phing (http://phing.info/) um sistema de automação de entrega e, graças a este último, com o PHPunit (https://github.com/sebastianbergmann/phpunit/) um framework para testes. O Xinc é o servidor de integração do PHP por excelência, mas, não é a única solução. Podemos, por exemplo, usar o Hudson (http://hudson-ci.org/) que, apesar de ser desenvolvido em Java (arrrrgh!!!) tem uma interface mais amigável e uma curva de aprendizado menor.

Uma vez decidido ou servidor de integração resta-nos escolher as bibliotecas e funções que usaremos para documentar, padronizar e corrigir o código antes de entregar.  Neste quesito o PHP impera…

PHPDocumentor, a ferramenta de documentação do PHP. Se você sabe codificar, também sabe comentar. Acho que foi o Knuth que disse: O código é um livro que executa. O PHPDoc é a mais antiga e mais usada ferramenta de documentação de código PHP. Eu tenho usado o PHP DOX simplesmente por que gosto de testar coisas novas.

PHPUnit, citada acima, é a versão PHP do xUnit um dos melhores frameworks de testes disponíveis no mercado, que permite a execução de testes automatizados no código, além de possuir uma “linguagem” específica para a criação destes testes e avaliação de resultados. Além de testar e indicar os erros o PHPUnit pode ser configurado para gerar um relatório de erros. Este relatório será indispensável para o acompanhamento da integração continuada.

PHP Code Sniffer, analisa o código em busca de violações no padrão de codificação. Ou seja, garante que o código guardado no Subversion, atende os padrões pré-estabelecidos de codificação e, consequentemente, é de leitura fácil. Já vem com os padrões usados pela Zend e pelo pessoal do PEAR.

PHP Depend, realiza uma análise estática do código para a geração de métricas de codificação. Use-o para analisar a qualidade, e complexidade, do código. Se seu projeto é grande, esta ferramenta merece sua atenção.

PHPMD (ou detector de bagunça em PHP) usa as mesmas métricas do PHPDepend e, assim como ele, faz uma análise do código e indica o grau de entropia (desordem, bagunça) do seu código.

PHPCPD (detector de copia e cola). Quantas partes do seu código são apenas copiadas e coladas? Será que não seria possível criar uma função ou classe para estas partes. Esta ferramenta vai analisar o código e indicar trechos candidatos para substituição.

PHPDCD (detector de código morto), varre seu código atrás de métodos e funções definidas, mas nunca usadas. Reduzindo o tempo de manutenção do código e de interpretação.  Mas de uma vez assisti desenvolvedores perdendo dias de manutenção para corrigir uma função que nunca seria usada. Não é comum em projetos pequenos onde um ou dois desenvolvedores cuidam de todo o código, mas em projetos grandes, isso acontece toda hora.

Coloquei as ferramentas na ordem em que devem ser chamadas. Você terá que estudar cada uma delas, para ver como criar e analisar os relatórios. Além disso, deverá criar um script no servidor de integração escolhido para enviar este código para o cliente.  Talvez, dependendo do tamanho do seu projeto e da demanda do seu servidor, seja necessário incluir um ou dois passos para limpar, verificar, mesclar e comprimir javascript e css o Minify  pode ajudar aqui.