Monthly Archives: July 2008

Congresso Nacional de PHP – CONAPHP

No site www.conaphp.com.br

A comunidade de PHP do Brasil se organizou mais uma vez este ano para promover mais um grande evento de PHP, desta vez com marca própria: CONAPHP – Congresso Nacional de PHP.

Durante os 2 dias do evento, serão apresentadas várias palestras pelos habituais nomes da cena de PHP do Brasil, mas este ano o evento contará com as presenças dos palestrantes internacionais: Andrei Zmievski (Smarty, PHP-GTK, PHP 6 Unicode) e César Rodas (PHP Programming Innovation Award, Google Summer of Code, WordPress).

O CONISLI é um evento muito popular de Software livre que sempre teve uma forte presença da comunidade de PHP desde 2005. Este ano a comunidade de PHP do Brasil se empenhou para organizar um evento de PHP que será um embrião de um tão desejado futuro evento organizado de forma independente, ou seja, organizado apenas por membros da comunidade de PHP.

CONAPHP – Congresso Nacional de PHP é a proposta inicial para uma nova marca que destinguirá eventos de PHP organizados exclusivamente por membros da comunidade de outros organizados por outras entidades.

À semelhança do que acontece noutros países, os maiores eventos de PHP são organizados por membros da comunidade. O CONAPHP não será diferente.

O tamanho da comunidade de PHP no mundo está estimado em 4,5 milhões de profissionais que trabalham no desenvolvimento e manutenção de mais de 20 milhões de sites. A comunidade de PHP no Brasil tem cerca de 5% do total global, portanto são mais de 200.000 profissionais de PHP brasileiros.

Como demonstração da sua força, a comunidade de PHP do Brasil está trazendo para este evento 2 palestrantes internacionais, para além de vários outros nomes conhecidos no Brasil.

Andrei Zmievski é um reputado desenvolvedor no núcleo de PHP. Ele é mais conhecido por ter sido o criador do sistema de templates Smarty e pela extensão de criação de aplicações desktop PHP-GTK.

Este ano ele vem falar o PHP 6, nomeadamente da maior mudança da qual ele foi o principal arquiteto: suporte nativo a Unicode. Este recurso vai facilitar muito o desenvolvimento de aplicações internacionalizadas em que o texto usa alfabetos distintos dos usados na Europa e Américas, como por exemplo os usados nos paises da Ásia, Leste Europeu, tais como Rússia, China, Japão, Coreia, etc..

César Rodas é o outro palestrante internacional convidado. Apesar de ser ainda um jovem universitário que estuda no Paraguai, César já participou em atividades dignas de grande destaque, como o fato de ter sido o vencedor do PHP Programming Innovation Award de 2007 organizado pelo site PHPClasses.org.

Neste evento Cesar virá falar sobre o seu mais recente trabalho de destaque incluido na iniciativa Google Summer of Code (GSOC). Trata-se do desenvolvimento de recursos avançados para o popular sistema de blogs WordPress que permitem lidar com arquivos de conteúdo de grande porte em sistemas mais apropriados para esse efeito, como o YouTube, Amazon S3, Google Picasa, etc..

Tudo aponta para que este seja mais um evento concorrido com grande participação de profissionais de PHP de todo Brasil. Se trabalha com PHP, não deixe de participar neste evento imperdível.

A chamada para trabalhos do CONISLI já começou. As pessoas interessadas em dar palestras no evento sobre PHP ou outros temas devem submeter as suas propostas no site do evento.

Smarty e caching – parte 4

Até agora temos visto como funciona a parte de caching do Smarty com exemplos que parecem vir da documentação(muitos na verdade são bem parecidos). Ainda existem mais algumas coisas que não são tão obvias assim para se se estudar. Esse pedaço final do artigo visa explicar essas.

Se você navegar até os outros artigos, perceberá que até o momento trabalhamos somente com um template (arquivo.tpl). Uma das propriedades mais interessantes do cache do Smarty é a capacidade dele trabalhar de forma independente com vários arquivos.

Vamos voltar um pouco ao Smarty para ter certeza de que entendemos o que eu acabei de dizer:

O Smarty gerencia templates, assim, você pode separar seu template em blocos. Vamos dizer que você tenha a seguinte estrutura:

Cabeçalho, menu da esquerda, chamada de artigos, chamada de eventos, rodapé.

Embora sua página seja uma só, você pode monta-la a partir de vários bloquinhos no Smarty.

Você teria arquivos como:

cabecalho.tpl, menu.tpl, chamadaArtigos.tpl, chamadaEventos.tpl e rodapé.tpl.

Note que não estamos usando um index.tpl neste exemplo. Muita gente iria criar um index.tpl e incluir as diretrizes de include nele. No nosso caso todos controles de exibição são feitos no index.php usando o metodo display().

Voltando ao caching, como já deve ser imaginável, se você está controlando o display de cada área, você também pode controlar o cache de cada área de forma independente. Por exemplo, o cabecalho.tpl, rodarpá.tpl e menu.tpl podem ter um cache de longa duração, os eventos podem ser atualizados a cada hora e os artigos podem ser atualizados manualmente a cada vez que se insere um novo.

Desta forma, temos uma única página, que sozinha tem vários controles de cache diferentes.

Não vou mostrar o exemplo completo de um código como esse, porque ele vai bem além do escopo deste artigo, mas vamos mostrar algumas das partes relacionadas ao cache.

O site de artigos e eventos.

Temos nossos TPLs montados e funcionando. Por preferência pessoal, gosto de separar os arquivos que controlam cada TPL em arquivos independentes. Assim, para cada TPL tenho um arquivo PHP que faz todas as buscas de banco, controle de cache, etc…

Nosso index.php vai acabar ficando +- assim:

<?php
/* includes diversos para que tudo funcione direito
* incluindo o include do Smarty, banco, etc…
*/

include(‘cabecalho.php’);
include(‘menu.php’);
include(‘chamadaArtigo.php’);
include(‘chamadaEventos.php’);
include(‘rodape.php’);

?>

Bem simples na verdade. A index essêncialmente se encarrega de chamar todos os objetos e métodos necessários para que tudo funcione corretamente (que eu geralmente separo em um único arquivo para que eu possa fazer somente um include na Index).

Cada arquivo controla sua própria exibição, por exemplo o cabecalho:

$Smarty->cache_lifetime = 3600;
if(!$smarty->is_cached(‘cabecalho.tpl’)){
//…
}
$Smarty->display(‘cabecalho.tpl’);

E assim por diante.

Um bloco um pouco diferente é o bloco de artigos. Você pode notar na descrição da funcionalidade acima que eu disse que o bloco deveria ser renovado somente quando um artigo novo é publicado. Assim, o controlador do template não tem controle sobre a renovação do artigo, não usamos o lifetime para determinar quando o template deve ser limpo.

O que de fato fazemos é, no admin, quando rodamos a rotina de publicar o artigo, forçamos a limpeza do cache desse bloco.

No arquivo de publicarMateria.php, colocaríamos além de todos os controles de insert em banco e etc…, também uma chamada de Smarty similar a essa:

$Smarty->clear_cache(‘chamadaArtigo.tpl’);

(note que a página publicar matéria não precisa estar sendo controlada via Smarty para usar o objeto Smarty, basta que ele tenha uma referência ao objeto).

Bom, falamos muito sobre o cache, mas ainda não concluímos todas as coisas que existem. Como este artigo visa apenas melhorar o seu entendimento de como utilizar o cache do Smarty, não vou entrar em detalhes de tudo que é possível e nem de todas as outras funcionalidades associadas ao cache do Smarty. De uma forma geral, com o conhecimento que você adquiriu nesses artigos, você já tem a faca e o queijo na mão.

A regra básica de programação ainda permanece verdadeira, planeje suas ações. Desenhe, pense, estude , teste e só depois, faça.

Bom galera, qualquer coisa, só me mandar suas dúvidas ou sugestões. O LiveJournal não tem form de e-mail, então basta ir pro http://bugz.doutromundo.com e usar o de lá.

Smarty e caching – Parte 3

Antes de entrarmos de cabeça em uma das partes que eu acho mais interessante do Smarty Cache, uma coisa que deveria ter sido apresentada no último artigo era como limpar o cache.
Por falta de um lugar melhor, aqui vai.

Como você pode ver temos duas possibilidades, opção 1 permite limpar todos os caches do site em um único comando, e a opção 2 permite que você limpe o cache de um template individual.
Sugiro que você tome um certo cuidado ao utilizar o comando cleal_all_cache() pois em servidores com alta visitação, você repentinamente ter que gerar todos os arquivos de cache pode causar um impacto indesejado no site. Planeje suas mudanças de cache cuidadosamente. Mais nesse assunto depois.

Muitos caches, um template.

Uma das perguntas que eu mais ouvi ser feita (não somente com relação ao artigo mas nas empresas onde trabalhei com Smarty) foi em relação ao controle de de exibição do cache. Vou exemplificar usando o cenário similar ao explicado em um comentário no meu primeiro artigo:

Um template de Menu (menu.tpl) entra no cache. Quando o usuário está logado, o menu muda para não incluir os campos de login e senha, substituindo-os por um link de “logoff”.
Uma típica solução para um cenário desses seria algo assim:

(eu resumi um pouco os códigos, pois já presumo que você saiba fazer o include do Smarty, setar o cache=1 etc….)

O código acima deveria funcionar relativamente bem, porém, ele tem não tão obvio.
O menos obvio é que toda vez que rodamos esse PHP, checamos por uma sessão chamada “id_logado” e decidimos o que fazer a partir dela. Vamos fazer um simulado pra ver o que acontece:
1 – Visitante
– entra ná pagina, ele não tem id_logado, limpa o cache, monta o menu, mostra o display
2 – Novo Visitante
– entra ná pagina, ele tbm não tem “id”, limpamos o cache, monta o menu, e mostra o display
3 – usuario logado – o usuario tá logado, limpamos o cahce, montamos o menu, e mostrams o display.

Bom sem continuar, vemos que de fato, embora estamos usando o cache, na realidade, estamos apenas gerando mais trabalho para o processador, sendo que toda vez estamos limpando o cache. Esquecemos de utilizar o is_cached para checar se o template está cacheado ou não. Então vamos lá:

Agora geramos outro problema: De novo aos testes:
1 – visitante – não tem id, não tem cache, seta valores, mostra display
2 – visitante – nao tem id, o cache existe, mostra display
3 – visitante – nao tem id, o cache existe, mostra display
(legal com o visitante funcionou)
4 – usuario – tem ID, cache existe!, mostra display

Pronto como resolvemos isso? O Smarty guarda o primeiro cache, independente de termos logado ou não… assim todo mundo ve a página com o formulário de login.

Eu demorei, mas é importante que você entenda em detalhe a lógica por trás do Smarty para evitar problemas enquanto desenvolve. É muito comum você(eu ou qualquer um) fazer esse tipo de erro ao desenvolver, e por isso, fazer simulados com pequenos pedaços de código enquanto você desenvolve é importante.

Como resolvemos esse problema? Com cache dinâmico.

O cache dinâmico (por falta de melhor nome), permite você levar em consideração variáveis na hora de cachear seus arquivos. Vamos ao código, depois a explicação:

Tá onde que mudamos? Eu adicionei a variável $logadoID como parâmetro dos metodos is_cached(), clear_cache() e display().
Agora vamos lá aos testes:

1 – visitante – não tem id, não tem cache menu.tpl0, seta valores, mostra display
2 – visitante – nao tem id, o cache menu.tpl0 existe, mostra display
3 – visitante – nao tem id, o cache menu.tpl0 existe, mostra display
4 – usuario 5 – tem ID = 5, o cache menu.tpl5 não existe, seta valores, mostra display
5 – usuario 5 – tem ID = 5, o cache menu.tpl5 existe, mostra display
6 – visitante – nao tem id, o cache menu.tpl0 existe, mostra display
7 – usuario 9 – tem ID = 9, o cache menu.tpl9 não existe, seta valores, mostra display
8 – usuario 5 – tem ID = 5, o cache menu.tpl5 existe, mostra display
8 – usuario 9 – tem ID = 9, o cache menu.tpl9 existe, mostra display

Pelos testes, parece que tudo funcionou!
Eu deixei a linha comentada do clear_cache porque é importante que você veja que no minuto que se usa o cache dinâmico, as funções que trabalham os templates precisam ter o “ID” associadas a elas.
Agora você deve estar perguntando porque eu demorei tanto para explicar algo que tão simples.
Usar o cache dinâmico em certos casos é imprescindível, você não tem como fazer algo assim sem ele, mas um “erro” muito comum dos desenvolvedores de Smarty é sair colocando ID em tudo que é cache. È importante lembrar que todo cache é um arquivo em disco, e que usando o cache dinâmico, você aumenta o número de arquivos existente no seu HD.
Isso pode não parecer um problema muito sério, mas depois de algum tempo, e em um site grande, você pode ter literalmente milhões de arquivos cache. Se você cachear uma página que não muda com um ID, você acabará tendo centenas de milhares de cópias do mesmo arquivo, gastando espaço desnecessariamente.

O Cache dinâmico tem uma funcionalidade bem interessante. É possível apagar todos os caches com um ID=X. Usando o nosso exemplo acima, poderíamos apagar dodos os caches do usuário com ID=9.
Para tal, basta executar o comando:

$Smarty->clear_cache(null, $logadoID);

Bom é isso. No próximo artigo, eu explicarei como funciona o agrupamento de caches, e se der darei alguns casos de uso para vocês terem na cabeça na hora de sair desenvolvendo.

4# Zend/PHP Conference – ZendCon

Acontece este ano, o quarto ZendCon – Zend/PHP conference que tem como objetivo juntar desenvolvedores de adminstradores de empresas de todo o mundo durante 3 dias de evento.

O tema deste ano é “PHP de alto impacto” com sessões que irão explorar as varias maneiras que os desenvolvedores tem de propiciar funcionalidades, performace e escalabilidade nas novas aplicações web, resultando numa vantagem real para sua companhia.

Mais de 60 sessões

A Zendcon 2008 irá oferecer mais de 60 sessões técnicas, de tutoriais e estudos de caso, elaboradas para benificiar arquitetos, desenvolvedores, adminstradores de sistemas e adminstradores de empresa de todos os nívies de experiência com PHP. As sessões irão destacar detalhes das inovações para criar, operar e gerenciar aplicações com velocidade, escalabilidade e simplicidade do PHP. Os palestrantes deste ano incluem pessoas como Marcus Börger, Sebastian Bergmann, Chris Shiflett, Jay Pipes e muitos outros.

Este membros da comunidade irão falar sobre os seguintes assuntos:

  • PHP Business Cases
  • Best Practices
  • The Basics of PHP
  • Advanced PHP Topics
  • Performance and Scalability
  • Rich Internet Applications
  • Zend PHP on i5/OS
  • Zend Framework

Para saber mais entre em http://www.zendcon.com

Smarty e Caching – Parte 2

Agora que aprendemos um pouco sobre o chaching de uma forma geral, vamos olhar mais a fundo o mundo dentro do Smarty.

Eu geralmente trabalho com um arquivo de configuração geral para o Smarty. Um “smarty.config.php” que eu deixo em algum lugar acessível e fácil. Não vou entrar no mérito de organização de arquivos ou nomenclaturas, padrões de código etc… é apenas uma dica para facilitar a vida.

Bom você já deve estar usando o Smarty e está interessado em habilitar o cache. Para isso, basta setar a variavel “caching” para 1 com a seguinte linha:

$Smarty->caching = 1;

Onde $Smarty é o objeto Smarty que você instanciou antes.

Essa variavelzinha avisa o Smarty que você quer guardar as versões rendidas dos TPLs que você tem.

Vamos ver o que isso significa na prática:

TPL – Arquivo template (aleatorio.tpl):

O arquivo PHP (aleatorio.php):

Ao rodar essa página a primeira vez, teremos um resultado parecido com esse:

O número escolhido é: 45

Agora toda vez que você rodar sua página no browser, você terá o mesmo resultado (se não, verifique a configuração do seu Smarty, permissão de escrita nos diretórios, etc…)

Com esse simples exemplo, vemos a essência do funcionamento mais básico de cache no Smarty.

Vamos complicar as coisas um pouco. Vamos supor (só por conveniência) que este numero aleatório deve ser alterado a cada 5 minutos. Como que se faz isso?

Uma opção seria caçar o arquivo no cache e apagá-lo manualmente, mas imagino que isso seja um pouco trabalhoso demais.

A outra opção seria avisar o Smarty, que esse cache tem uma vida útil de 5 minutos.

O arquivo PHP (aleatorio5min.php):

Agora atribuimos um valor ao atributo “cache_lifetime” (traduzindo: vida util do cache).

Esse parametro recebe um número de segundos que deve ser cacheada uma página.

Agora se rodarmos esse exemplo 4 vezes em intervalos de 4 minutos, teremos:

0:00 – O número escolhido é: 32

0:04 – O número escolhido é: 32

0:08 – O número escolhido é: 78

0:12 – O número escolhido é: 19

(lembrem-se – os números são aleatórios e provavelmente serão diferentes)

Vou entrar em lifetime com mais detalhes em um outro artigo mais avançado, aqui meramente demos uma illustrada na utilidade do conceito.

Importante para o desenvolvedor.

Um dos atributos importantes quando se está usando o Smarty e o Cache, é o atributo:

compile_check

Ele basicamente verifica todos os arquivos envolvidos no template em questão. Se algum deles sofrer alguma modificação, o template é recompilado do Zero.

Isso é importante quando se faz modificações nos templates (tpl). Muitas vezes você irá ter situações onde você faz uma modificação em seu TPL e ela não é refletida no ambiente. Cheque sempre se você tem esse atributo ligado.

Ele é setado usando a linha:

$Smarty->compile_check = true;

Controle de fluxo:

Se você já tem uma certa experiência em programação, você deve ter percebido que do ponto de vista do PHP, nada mudou (peguemos o arquivo aleatorio5min.php)

O fluxo permanece o mesmo com e sem o cache. Isso, consequentemente não alivia nosso servidor caso ao invés de buscarmos um numero aleatório, tivessmos fazendo uma conta num banco MySQL ou fazendo um parse de um arquivo XML ou CSV.

Assim, será necessário fazer algumas mudanças no código para usufruir completamente do controle de cache do Smarty.

O que precisamos é verificar se o arquivo tem um cache válido, se ele não o ter, precisamos executar as funções necessárias para popular o template. Caso ele já tenha um arquivo de cache, podemos simplesmente exibir o arquivo cacheado, sem ter que preparar todas as variáveis.

Como voce pode ver, incluimos uma nova chamada – is_cached(‘arquivo.tpl’).

Essa chamada checa se o nosso cache é válido. Se ele não for (ela retornar false), executamos o nosso assign – no caso o gerador de números aleatórios.

Bom acho que já temos bastante para ir brincando.

Lembrem-se de algumas coisas para manter a vida fácil:

$Smarty->caching = 0; // não faz cache

$Smarty->is_cached(‘arquivo.tpl’) – é importante para controlar o fluxo de dados no servidor

No próximo artigo, vamos ver em mais detalhes como cachear resultados dinâmicos. Isso é algo que já me perguntaram, mas o assunto é muito comprido para deixar em um só artigo.