terça-feira, 28 de fevereiro de 2012

Novas características PHP 5.4 - Nova sintaxe para arrays e algumas baixas

Para começar o PHP 5.4 introduz uma nova sintaxe mais simples para a declaração de arrays:
Exemplo:
$array = [1, 2, 3];
Outro exemplo:
$foo = ['val_1' => 4, 'a', 2, 'bar' => 'na esquina'];

Pessoalmente acho esta nova forma menos verbosa e é uma abordagem mais parecida com a vista em outras linguagens como javascript e ruby.

Agora um minuto de silêncio para os que se foram:

  • break/continue $var syntax. Nunca usei este recurso para mais informações olhem aqui.
  • register_globals, allow_call_time_pass_reference, and register_long_arrays ini options. Só conheço o register_globals e pelo que dizem ele já vai tarde!
  • session_is_registered(), session_registered(), and session_unregister(). Estão aqui algumas funções que podem fazer falta para muitos desenvolvedores, principalmente em código mais antigo. Na versão 5.3 da linguagem PHP elas já disparam um warning do tipo E_DEPRECATED.
É isso aí! Melhor já ir preparando sua base de código para uma futura migração, dificilmente seus clientes e usuários vão aceitar que os erros no sistema foram devido a quebra de retrocompatibilidade na nova versão PHP.

domingo, 19 de fevereiro de 2012

Como saber o tamanho de um banco de dados Posgre

Dica rápida! Como obter o tamanho do espaço em disco utilizado por um banco de dados postgre? O processo é tão fácil quanto executar um comando sql:

SELECT pg_database_size('nome_do_banco');

Este comando vai retornar o tamanho em bytes, existe uma outra função que ajuda a converter este valor para um formato mais fácil de se ler:

SELECT pg_size_pretty(pg_database_size('nome_do_banco'));

É isso aí!

domingo, 5 de fevereiro de 2012

Standard Input e Standard Output

Amigos leitores vocês sabem o que é Standard Input e Standard Output (ou entrada padrão e saída padrão)? Bom, este post é para aqueles que não sabem e gostariam de saber.

Standard Input (SI) e Standard Output (SO) são respectivamente fluxos de entrada e saída de dados de uma aplicação. Basicamente qualquer aplicação rodando no seu computador tem acesso a estes fluxos de dados, seja ela um programa C compilado ou até mesmo seus scripts PHP. A forma e funcionamento destes fluxos é transparente para os programas já que este trabalho é feito pelo sistema operacional.

O sistema operacional também cuida da origem dos dados passados para a SI. Para um programa rodando na linha de comando geralmente os dados enviados para a SI deste programa vêm do teclado. Já tudo o que o programa escreve na SO o sistema operacional manda para o monitor. Ou seja, um programa que lê da SI e manda a saída para a SO se torna bastante flexível pois desta forma ele pode ser combinado com outros programas e scripts através destas interfaces universais. Este é o princípio da filosofia Unix:
This is the Unix philosophy: Write programs that do one thing and do it well. Write programs to work together. Write programs to handle text streams, because that is a universal interface. - Doug McIlroy 
Estas "text streams" citadas são a entrada e saída padrão.

E como fazer isso em PHP? No PHP a forma mais fácil de acessar a SI e SO é usando as constantes STDIN e STDOUT. Estas constantes são do tipo resource, o mesmo tipo retornado por funções como fopen.

Para lermos uma linha de texto digitada pelo usuário juntamente com o caractere "\n" (nova linha) podemos prosseguir da seguinte maneira:
$entrada = fgets(STDIN);

Se quisermos ler somente um caractere, para usar em uma construção switch por exemplo, podemo usar o seguinte código:
$opcao = fgetc(STDIN);

O STDIN é um stream que somente pode ser lido, e o STDOUT é um stream onde é permitido apenas escrever. Nos exemplos abaixo vamos demonstrar o uso do STDOUT.

Aqui vai um exemplo de dois programas que demonstram o poder da filosofia unix de criar programas pequenos que fazem apenas uma coisa bem e conversam com o mundo exterior através das interfaces universais SI e SO. Neste exemplo nós vamos processar o seguinte arquivo csv:

Astolfo,45
Bruna,22
Carlos,63
Daiana,15
Eriberto,30

É uma lista de nomes de pessoas com suas idades. Nós queremos criar um novo arquivo com os nomes em letras maiúsculas e com as idades em dias ao invés de anos. O nosso primeiro programa apenas processa os nomes das pessoas e passa o resultado para a SO permitindo que outros programas possam processar sua saída:



O próximo programa também lê a entrada através da SI, converte as idades de anos para dias e manda o resultado para SO.



Veja que os programas são praticamente iguais na forma como leem a entrada e escrevem na saída. Se você estiver em sistema *nix os seguintes comandos na linha de comando podem ser usados para lermos o arquivo original, usarmos os dois programas para processá-lo e criar um novo arquivo com a saída. Considerando-se que os scripts php e arquivo csv estão no mesmo diretório:

php capitalize_names.php < listanomes.csv | php ages_in_days.php > listanomes-saida.csv

Veja que estamos invocando o php para executar os scripts. Mas o que estes símbolos de menor, maior e tubo (|) estão fazendo ali?

Estes símbolos tem grande importância na execução dos programas.

  • <: Ele serve para redirecionarmos a Standard Input do script capitalize_names.php. No comando acima estamos dizendo para o sistema operacional que quando o script começar a ler o que estiver na SI ele mande o que estiver no arquivo listanomes.csv ao invés de mandar o que o usuário digitar no teclado.
  • >: Ele tem o mesmo propósito de redirecionamento do símbolo anterior. Só que agora estamos redirecionando a Standard Output. No comando acima estamos dizendo para o sistema operacional para que seja lá que o script age_in_days.php escrever em sua SO ele mande para um arquivo chamado listanomes-saida.csv, e o sistema operacional cuida da criação do arquivo caso ele não exista.
  • |: O tubo ou pipe como é chamado no mundo Unix é usado no comando acima para mandarmos a Standard Output do script capitalize_names.php para a Standard Input do script age_in_days.php.
No nosso exemplo acima usamos dois programas pequenos que nós mesmos criamos mas poderíamos ter usado muitos outros programas presentes no sistema operacional como grep, cat, wc etc.

O uso de redirecionamento da SI e SO juntamente com o uso de pipes é um recurso muito poderoso e bastante utilizado. Espero que com este post vocês possam assimilar este poder nos seus scripts PHP criar aplicações valiosas. Até a próxima!

sábado, 21 de janeiro de 2012

Cache de OpCodes para PHP

Sabe como diminuir o uso de memória e o tempo de resposta de suas aplicações PHP sem precisar modificar seu código? Não? E ainda tem mais! Você não precisa gastar nada para conseguir isso!

Parece bom demais para ser verdade não é mesmo? Mas existe uma ferramenta chamada APC (Alternative PHP Cache) que faz exatamente isso. O APC é uma extensão PECL que armazena e otimiza os opcodes PHP.

Os opcodes são as instruções que a máquina virtual PHP efetivamente lê. Todo código PHP que você escreve é transformado nestes opcodes e depois executado. O problema é que esse processo é feito para toda requisição recebida. Este processo é bem rápido, mas dependendo da quantidade de requisições recebidas em um determinado período (pense em algo como 500 requisições por segundo) e da capacidade de seu servidor, seus usuários vão ter de esperar cada vez mais para receber o conteúdo enviado pelo servidor.

Usando-se a ferramenta APC estes opcodes são gerados uma vez e armazenados na primeira requisição, nas próximas requisições o passo de ler o código PHP e gerar os opcodes já está feito, assim economizamos tempo e memória que seria usada na criação dos opcodes.

Se você tem o PECL instalado, a instalação do APC é bem simples. No linux execute:
#sudo pecl install apc

Eu tive um problema durante a compilação do APC e para resolver tive que também instalar o seguinte pacote:
#sudo apt-get install libpcre3-dev

Após fazer isso você pode copiar o script /usr/share/php/apc.php para uma pasta do apache. Quando você acessar este script através de seu navegador você poderá ver várias informações sobre o estado do APC no seu sistema. No menu "System Cache Entries" você pode ver quais scripts estão com seus opcodes armazenados.

Uma informação importante mostrada no apc.php é o Cache full count. Este número te diz quantas vezes o cache ficou totalmente cheio e o APC teve que excluir opcodes de scripts que estavam armazenados mas não foram acessados dentro do número de segundos estipulado por apc.ttl. Exemplo:
A página A.php está sendo acessada e o APC vai criar o cache dos opcodes para ela. Como a memória dedicada para o cache já está toda utilizada, o APC vai excluir o cache de D.php que não foi acessado nos últimos 5 segundos, estes 5 segundos estão definidos na varável de configuração apc.ttl. Você deve configurar o APC para que o Cache Full count não seja um número muito alto, pois este processo de limpar o cache frequentemente pode ter impacto na performance de seu sistema. Ou você aumenta a memória dedicada ao APC ou usa a configuração apc.filters para diminuir o número de scripts armazenados.

Espero que com esta dica vocês possam impressionar seus usuários com a velocidade de suas aplicações!

Ah sim! O APC não é a única ferramenta para cache de opcodes PHP:
http://en.wikipedia.org/wiki/List_of_PHP_accelerators

sexta-feira, 13 de janeiro de 2012

Novas características PHP 5.4 - Indireção de Arrays

Devo dizer que não me esforcei muito para me inteirar sobre as mudanças feitas na versão 5.3 da linguagem PHP. Não tive muitos problemas migrando código escrito para versões anteriores da linguagem. Os mais comuns foram warnings do tipo E_DEPRECATED causados por expressões deste tipo (dica para consertar o código: removam o "&"):
$obj =& new Class();

O uso de funções como eregi, split também passou a gerar warnings E_DEPRECATED.

Outra confissão é que eu nunca escrevi código que usa namespaces. E olha que a versão 5.3 foi lançada em junho de 2009!

Mas estou aqui para falar da vindoura versão 5.4 que possui algumas mudanças bem interessantes como a indireção de arrays. Mas o que é esta tal de indireção? Bom em inglês eles usam a palavra "dereference". Em computação é quando usamos uma referência ou endereço (pense nos ponteiros da linguagem C) para acessar e manipular um determinado valor. Em PHP quando usamos a referência $this para acessar algum membro da classe estamos fazendo uma indireção, ou seja, usando um endereço representado por $this para acessar o valor que realmente queremos seja uma varável escalar, uma instância de outra classe ou até mesmo um método.

Mas porque eu falei disso tudo? Até a versão 5.3 sempre que tínhamos uma função retornando um array nós só poderíamos acessar os valores do array usando uma varável para armazená-los, exemplo:

$meu_array = $objeto->retorna_array();
echo $meu_array[0];

Mas na versão 5.4 este código pode ficar menor:
echo $objeto->retorna_array()[0];

Agora nós podemos acessar o array diretamente na chamada do método que o criou. Acredito que o código ainda é fácil de ser entendido, pelo menos se o leitor já tiver um pouco de experiência.

Que venha o PHP 5.4!

sábado, 31 de dezembro de 2011

Documento XHTML 1.0 mínimo

Seus sites seguem os padrões web? Um jeito rápido de você saber é usando o serviço de validação do W3C (World Wide Web Consortium), o Markup Validation Service. Nele podemos validar documentos HTML e XHTML. Mas porque ter o trabalho a mais de manter os meus sites dentro dos padrões web? Bom, além de torná-lo um cidadão modelo na internet, sites que seguem os padrões web são melhores vistos por engines de busca como a google o que melhora a posição e visibilidade de seus sites. O uso de padrões também melhora a acessibilidade dos sites para pessoas com deficiências, isso é especialmente importante para sites governamentais. Outra vantagem é que com os padrões é mais fácil evitar problemas de incompatibilidades entre diferentes browsers, hoje um site tem que ser exibido corretamente em no mínimo três browsers diferentes: Firefox, Chrome e Internet Explorer. Sem contar os browsers de dispositivos móveis que são um boa parte dos acessos hoje em dia.

Eu geralmente uso XHTML 1.0 nos meus sites, e toda página servida deve uma estrutura mínima para estar dentro dos padrões. Aqui vai o exemplo:



Este documento usa o DOCTTYPE XHTML 1.0 Strict, que é bem rígido com a estrutura do documento. O DOCTYPE define os DTD (Document Type Definitions) usados para validar a sintaxe e gramática da marcação XHTML. Existem várias regras para escrever um documento xhtml válido como todas as tags tem que ser escritas com letras minúsculas, todas as tags de abertura devem ter a tag de fechamento correspondente, os atributos das tags também devem ser escritos com letras minúsculas etc.

O DOCTYPE Strict é mais indicado para páginas onde a marcação html e a apresentação são totalmente separadas através do uso de CSS. Um DOCTYPE mais flexível é o Transitional, que permite o uso de elementos em desuso, ou quando o documento mistura marcação e regras de apresentação. Neste caso o exemplo seria:



Muitas das informações neste post foram obtidas no excelente livro "Construindo sites com CSS e (X)HTML" de Maurício Samy Silva.

Quer você use XHTML ou HTML eu acho muito importante seguirmos os padrões web, desta forma sempre estaremos tornando a web um lugar melhor.

domingo, 18 de dezembro de 2011

Como escrever javascript com PHP?

Quem já tem alguma experiência com desenvolvimento web já deve ter passado pela experiência de escrever código javascript usando código PHP. A técnica é bem interessante e poderosa, pois você está gerando código javascript dinamicamente usando PHP que também é uma linguagem dinâmica, Batman e Robin ficariam orgulhosos.

Aqui vai um exemplo: Você tem um site bastante visitado e que usa bastante ajax para evitar recarregar toda a página para cada ação do usuário. Mas e que tal você economizar até nas chamadas ajax? Supondo aquela situação básica onde o usuário do site escolhe uma opção em um select e algum lugar da página é recarregado automaticamente de acordo com a opção escolhida. Supondo ainda que as informações envolvidas não mudem com muita frequência, vamos fazer com todas as informações já estejam na página permitindo o código javascript carregar as informações na página sem uma requisição ajax.



O código simplesmente preenche o input "sentimento_cor" de acordo com a cor escolhida no select. Como vocês podem ver estou preenchendo o array javascript "sentimentos_cores" com os valores vindos do array PHP "sentimento_cores". Desta forma a função "mostra_sentimentos" vai somente pegar o valor do input diretamente do array javascript sem a necessidade de uma requisição ajax.

Até aí tudo bem. No entanto se você testar este código vai perceber que um erro javascript vai aparecer logo de cara na seguinte linha:
sentimentos_cores.push("depressão, luto e "escuridão"");
Como a palavra escuridão está entres aspas duplas estas se misturaram com as aspas duplas do código javascript formando um comando inválido. O problema aqui foi que nós não escapamos a saída javascript. E como já comentei em um artigo anterior não escapar a saída pode trazer sérios problemas para sua aplicação web.

E como escapamos a saída javascript? Muito simples, a linguagem PHP já possui uma função que faz isso, embora o nome da função não seja óbvio, a função json_encode. Assim o trecho onde a PHP gera o código javascript ficaria assim:



Agora vá e observe a saída gerada pela linguagem PHP:



As aspas foram escapadas e os acentos foram convertidos para uma representação unicode. Na verdade nós poderíamos ter simplificado o código usando a função json_encode diretamente no array PHP o teria gerado a seguinte string:

["al\u00edvio e paz","amor e paix\u00e3o","depress\u00e3o, luto e \"escurid\u00e3o\""];

Esta string é código javascript, e pode ser usado diretamente no código javascript da página:



Espero que este post seja útil para quem estiver usando PHP para gerar javascript, até a próxima!