CakePHP Brasil

27 maio 2008

Em breve nova release

Arquivado em: Eventos, Outros — Tags:, , , , , , — Juan Basso @ 9:59 pm

Pessoal,

O pessoal do CakePHP, mais especificamente o Mariano Iglesias, anunciou dia 13/05/2008 no Bakery que em breve estariam disponibilizando uma nova release, mas dessa vez para o CakePHP 1.2!

No anúncio, pede a todos “padeiros” (nós) para relatarmos bugs para que possam ser corrigidos antes de finalizar a versão. Não estão sendo aceitos pedido de melhoramento (enhancement) para a versão 1.2, mas para a 2.0 será bem vindo. Quem tiver novas idéias ou encontrou algum bug, relate através do Trac.

E neste clima de novidades, foi publicada uma nova versão da API do CakePHP 1.2, cuja versão é 1.2.0.7008. Quem quiser acessar, basta entrar no link http://api.cakephp.org/.

Abraços e vamos ficar na espera desta release tão aguardada por muitos!

25 maio 2008

Otimizando códigos no PHP

Arquivado em: Outros — Tags:, , — Juan Basso @ 11:46 pm

Este post não é sobre CakePHP diretamente, mas pode influenciar no modo de programarmos no cake.

Olhando alguns sites de otimização, benchmark, entre outros, vi que há algumas formas de otimizarmos os códigos sem grandes alterações, mas que podem melhorar a performance. São elas:

1) Aspas com variáveis

1.1) Aspas duplas VS aspas simples

Utilizar uma string com aspas simples é ligeiramente mais rápido que utilizar aspas duplas pelo fato da necessidade de interpretar varáveis (com aspas simples ele interpreta variáveis). Exemplo:

1
2
echo 'texto qualquer'; // Mais rápido
echo "texto qualquer"; // Mais lento

1.2) Variável em aspas dupla ou concatenando

Concatenar uma variável a uma string é muito mais rápido que colocar a variável dentro de uma string com aspas duplas.

1
2
echo 'texto qualquer ' . $variavel . ' outro texto'; // Quase duas vezes mais rápido
echo "texto qualquer $variavel outro texto"; // Bem mais lento

2) echo VS print

Utilizar a função echo é mais rápida que a função print, pois não retorna nenhum valor. A função print informa se houve mensagem de erro. O uso de print é recomendado só em casos que há necessidade de retorno (o que são poucos na prática). Além disso, é recomendável a utilização vários parâmetros no echo ao invés de concatenar strings. É opcional o uso de parâmetros nestes comandos, sendo o ideal não utilizar. Exemplo:

1
2
3
echo 'texto qualquer ' . $variavel . ' outro texto';
print 'texto qualquer ' . $variavel . ' outro texto'; // Mais lento que caso anterior
echo 'texto qualquer ', $variavel, ' outro texto'; // Note as vírgulas. Este caso é mais rápido que os anteriores

3) Variáveis

3.1) Nomes

Definir variáveis com nomes menores é consideravelmente mais rápido que nome maiores. Exemplo:

1
2
$a = 'texto';
$asdhaisuhniduahsduiash = 'a'; // Mais lento que anteiror, consideravelmente

3.2) Atribuições

Em atribuições, várias atribuições são mais rápidas que em atribuições unificadas. Exemplo:

1
2
$a=$b=0; // Mais lento
$a=0; $b=0; // Mais rápido

Usar os operadores +=, -=, /=, *= e .= também aumentam a performance. Exemplo:

1
2
3
4
5
6
7
$var = 'abc';
 
// Mais lento
$var = $var . 'def';
 
// Mais rápido
$var .= 'def';

3.3) [Pré/Pós]-incremento

Preferir o uso de pré-incremento (++$i) ao invés de pós-incremento ($i++), pois aquelas consumem um opcode a menos, visto que o segundo caso o PHP cria uma variável temporária para atribuir o valor e no primeiro caso não. PS: Isto vale apenas para PHP! Nas outras linguagens isto não se aplica.

4) Estruturas condicionais

4.1) if VS switch

Estruturas com if e vários elseif são mais rápidas que a estrutura switch. Exemplo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// Mais rápido
if ($a == 1) {
  echo 1;
} elseif ($a == 2) {
  echo 2;
} else {
  echo 3;
}
 
// Mais lento
switch ($a) {
  case 1:
    echo 1;
    break;
  case 2:
    echo 2;
    break;
  default:
    echo 3;
}

4.2) Operador ternário VS if

Operadores ternários são significativamente mais lentos que if’s. Exemplo:

1
2
3
4
5
6
7
8
9
// Mais lento
echo $a == 1 ? 1 : 2;
 
// Mais rápido
if ($a == 1) {
  echo 1;
} else {
  echo 2;
}

4.3) Operadores de igualdade

Operadores de igualdade com comparação de tipos (===) são consideravelmente mais rápidos que apenas operadores de igualdade (==). Exemplo:

1
2
if ($a == 'a') { // Mais lento
if ($a === 'a') { // Mais rápido

5) Arrays

5.1) Definição

Definir um array pelos índices é consideravelmente mais rápido que usar o método array(…). Exemplo:

1
2
$a = array('a', 'b'); // Mais lento
$a[0] = 'a'; $a[1] = 'b'; // Mais rápido

5.2) Leitura

Verificar a existência de um elemento no array é mais rápido que procurá-lo. Exemplo:

1
2
array_key_exists('texto', $arr); // Mais lento
isset($arr['texto']); // Mais rápido

PS: Se o valor do campo pode ser null, isset irá retornar false neste caso. Portanto, tome cuidado com isto.

6) Arquivos

Usar a função file_get_contents() é ligeiramente mais rápida que utilizar a função file(), porém é mais lenta que utilizar fopen() com fread(). Exemplo:

1
2
3
4
5
6
7
8
9
10
// Mais lento
$arquivo = file('arquivo.txt'); // Retorna array
 
// Pouco mais rápido que anterior
$arquivo = file_get_contents('arquivo.txt'); // Retorna string
 
// Mais rápido, significativamente
$f = fopen('arquivo.txt', 'r');
$arquivo = fread($f, filesize('arquivo.txt'));
fclose($f);

7) Buscas e validações

7.1) Substring

Ao buscar substrings, é preferível usar, na ordem, strpos(), depois preg_match() e por último ereg(). A strpos, quando é possível de ser utilizada, tem uma eficiência muito superior as demais.

7.2) Números

Caso necessite verificar se um texto ou variável contém apenas números, é preferivel utilizar a função ctype_digit($var) ao invés de preg_match(‘/[0-9]*/’, $var).

8 ) Outras otimizações

8.1) Funções de controle de saída

Uso de Usar o método ob_start() reduz de 5 a 15% o tempo de execução.

8.2) Evitando repetição de funções

Definir uma variável com um valor que vai ser usado diversas vezes aumenta a performance consideravalmente. Exemplo:

1
2
for ($i=0, $max=count($arr); $i<$max; $i++) { // Mais rápido
for ($i=0; $i<count($arr); $i++) { // Mais lento

8.3) Processamento não necessário

Blocos de textos fixos é preferível que seja impresso fora do PHP, por exemplo:

1
2
<?php echo $var; ?>
Texto adicional grande

É preferível do que:

1
<?php echo $var . 'Texto adicional grande'; ?>

8.4) Evitar o uso de funções aliases e automágicas

Funções aliases são as funções que significam a mesma coisa que outras. Por exemplo, sizeof é sinônimo (alias) de count. Veja a lista completa de funções aliases aqui.

Funções automágicas são aquelas definidas pelo PHP: __get, __set, __autoload, __call, __sleep, …

8.5) Evitar uso de funções abrangentes

Preferir a função empty() ao invés de count(), assim como isset($var{X}) ao invés de strlen($var) < X.

8.6) Declare os métodos estáticos

Definir os métodos estáticos com a palavra static deixa seu código até 4 vezes mais rápido que o não declarado como estático. Exemplo:

1
2
3
4
5
6
7
class XXX {
  public function a() { return 1; }
  public static fuction b() { return 1; }
}
 
XXX::a(); // Mais lento
XXX::b(); // Até 4 vezes mais rápido

8.7) Evitar o operador @

Ao invés de usar o operador @, desativar a exibição de erros. Exemplo:

1
2
3
4
5
6
7
// Mais lento
@acao();
 
// Mais rápido
$old = ini_set('error_reporting', 0);
acao();
ini_set('error_reporting', $old);

9) Extra-código

Se você tem acesso ao servidor web, é recomendavel a utilização de otimizadores e/ou cachers, como o Zend Optimizer, APC, eAccelerator, memcache, etc.

Outra alternativa que pode ser usada em conjunto, é usar o callback ‘ob_gzhandler‘ na função ob_start() OU ativar a configuração zlib.output_compression no php.ini. Isso faz com que depois de gerado o código HTML, ele seja compactado e enviado para o cliente, reduzindo a quantidade de tráfego na rede.

Fontes de referência:
https://trac.cakephp.org/ticket/2764
http://phplens.com/lens/php-book/optimizing-debugging-php.php
http://benchmark.nophia.de/benchmarks.html
http://www.estvideo.com/dew/pages/phpbench/
http://ilia.ws/archives/12-PHP-Optimization-Tricks.html
http://www.vulgarisation-informatique.com/optimiser-php.php
http://www.moskalyuk.com/blog/php-optimization-tips/1272
http://www.ilia.ws/files/zend_performance.pdf
http://www.faqts.com/knowledge_base/view.phtml/aid/1/fid/40

Inflections em português

Arquivado em: CakePHP — Tags:, , — Juan Basso @ 4:53 pm

Para quem não sabe, inflections são as regras de pluralização do idioma no CakePHP. Por exemplo, se temos uma tabela chamadas ‘casas’, o CakePHP precisa do singular disso pra criar o model, ou seja, nosso model teria que ser ‘Casa’. Outros lugares, como na parte de scaffolding, ele faz o caminho inverso: pega o nome do model e pluraliza para apresentar (transformando ‘Casa’ em ‘Casas’).

O Sadjow, amigo milico, transformou uma inflection feita para Ruby Rails pro CakePHP. Está versão está disponível em http://manual.cakephp.com.br/doku.php?id=inflections_portugues.

Porém, algumas coisas estavam erradas e outras faltando. Consultei alguns sites da internet para ver mais sobre regras de pluralização e fiz um compremento. O resultado está aqui. Lembre-se de alterar a extensão de phps para php.

Basta colocar este arquivo na pasta da sua aplicação (normalmente ‘app’), no sub-diretório ‘config’, ou seja, ‘app\config\inflections.php’. Isso fará a pluralização na aplicação, bake, etc.

Caso alguém ache alguma palavra que não esteja transformando corretamente, favor me informar pra que eu corrija.

Se manter atualizado nas novidades

Arquivado em: Outros — Tags:, , , , , , — Juan Basso @ 12:40 pm

A pedidos do João Pedrini, vou estar falando como se manter atualizado nas novidades do CakePHP.

Todo dia, no horário do almoço, na empresa, eu dou uma olhada no blog do Daniel Hofstetter, também conhecido como CakeBaker, para ver sobre novos posts. O site dele tem atualizações seguidas (praticamente uma por dia) e trás novidades sobre o que está acontecendo com os fontes, novos recursos, pontos de vista, novas idéias, referência a outros sites, etc. Em resumo, esse site eu considero uma grande fonte de referência para o dia-a-dia. O site é em inglês, realmente, mas não é um inglês pesado, não é difícil de entender e qualquer coisa é só colocar no Google Tradutor que facilmente você entende o que ele quis dizer nos seus posts, além de contar, na grande maioria dos posts, com exemplo dos novos recursos.

Outra grande fonte de informação e troca de conhecimento é no Google Groups PT. Lá você tira dúvidas, vê e aprende com os problemas dos outros, ajuda quando sabe, etc. Quem tiver alguma dúvida sobre CakePHP, pode postar lá que o pessoal vai ajudar, se possível.

Também baixo o código fonte do repositório SVN todo dia com o TortoiseSVN. Com ele eu consigo ver o que foi adicionado/retirado/otimizado/corrigido/etc. O grupo de desenvolvimento do CakePHP atualiza quase todo dia alguma coisa. Então, é melhor ver uma vez por dia do que deixar pra ver a cada nova release, pois nas novas releases entra MUITA coisa nova.

No mais, alguns sites do Google de vez enquanto para me atualizar em outras fontes, as vezes entro no site Debuggable para ver, mas não sou muito fã dele.

Um site que reune vários feeds internacionais é o CakePHP Super Feed. Ele junta os principais feeds do mundo e coloca ali.

Quem tiver outros canais, favor me informar, ficarei grato. :)

24 maio 2008

Sub-dominio para projetos em Cake

Arquivado em: Outros — Tags:, , , , — Juan Basso @ 5:53 pm

Pessoal,

Tenho esse host e a única utilidade está sendo para este blog. Porém, para não deixá-lo só para isso, estou abrindo para o pessoal que deseja cadastrar projetos em CakePHP.

Para quem quiser, basta responder este tópico ou mandar um email para jrbasso@cakephp-brasil.org que crio o subdominio e passo a senha. A parte do cake será compartilhada entre todos os projetos e será sempre usada a versão mais atual do SVN, atualizada a cada semana.

Não tenho muito a oferecer quanto a controle de versão, mas serve para publicarem o trabalho realizado. Se quiserem um servidor de SVN gratuito, recomendo o http://www.assembla.com/

PS: O nome do projeto não pode ser blog e www. :)

Instalação recomendada (mais segura)

Arquivado em: Tutoriais — Tags:, , , — Juan Basso @ 3:01 pm

Quando vamos instalar nossas aplicações em um servidor, temos o costume de pegar todo o conteúdo e jogar dentro de uma pasta ou direto na raiz do servidor de web. Digitamos o endereço e lá está nossa aplicação rodado no servidor! Uau! Porém, não é bem assim que devemos fazer. Em ambiente de desenvolvimento até podemos fazer, pois não temos nada tão seguro assim e é mais fácil para nós trabalharmos, mas para ambiente de produção recomenda-se fazer de outra maneira.

Colocar os diretórios app (ou o nome que você deu), cake e vendors dentro de um local não visível ao público (na maioria dos servidores de hospedagem, é a pasta fora de public_html ou www). Feito isso, mover o conteúdo da pasta app\webroot para o local público que você deseja que apareça. Por exemplo, se você quiser http://site/minhaapp/, coloque os arquivos da webroot (.htaccess, index.php, pastas img, js, css, …) dentro de public_html/minhaapp/.

Após feito isso, abrir o arquivo index.php para configurar o local que a pasta da sua aplicação está e onde está o cake também. Vamos supor que coloquei minha pasta app e cake dentro da pasta ’site’, sem visibilidade ao público (no mesmo nível de public_html) e que coloquei os arquivos de webroot na raiz do meu domínio (direto em public_html ou www), ficando da seguinte estrutura:

/
	site/
		app/
		cake/
	public_html/

No lugar de:

1
define('ROOT', dirname(dirname(dirname(__FILE__))));

Vamos substituir por:

1
define('ROOT', dirname(dirname(__FILE__)) . DS . 'site');

Com isso, ele informa que os diretórios de cake e app estão a um nível inferior e dentro de site.

Depois, substituir:

1
define('APP_DIR', basename(dirname(dirname(__FILE__))));

Por:

1
define('APP_DIR', 'app');

Assim informamos o nome da nossa pasta app. Ele irá procurar dentro de ROOT . APP_DIR.

Pronto! Alteramos o diretório dos nossos arquivos e não há perigo deles serem vistos pelo público. Assim se o Apache deixar de reconhecer os arquivos .php, o máximo que as pessoas verão é o index.php que não trás muita informação e ninguém rouba suas regras de negócio, login de banco de dados, etc.

Isto também está documentado no manual:

Usando o helper Number

Arquivado em: CakePHP — Tags:, , — Juan Basso @ 2:00 am

Acredito que na maioria dos sites é necessário a formatação de números, incluindo valores. Por isso, vou explicar as funções que o helper Number pode nos proporcionar para que nossos sistemas fiquem mais ágeis ainda.

Ele possui 5 métodos, são eles:

precision: você passa um número de parâmetro e ele vai retornar este número com uma certa quantidade de casas decimais. A quantidade de casas que você quer é definido no segundo parâmetro. Este segundo parâmetro é opcional, sendo o padrão 3. Exemplos:

1
2
3
$number->precision(50.37243682); // Retornará 50.372
$number->precision(50.37243682, 2); // Retornará 50.37
$number->precision(50.3, 3); // Retornará 50.300

toReadableSize: você passa uma quantidade de bytes e ele retorna de uma forma legível o tamanho. Por exemplo, 1024 bytes correspondem a 1 KB, portanto ele vai te retornar ‘1 KB’. Exemplos:

1
2
3
4
$number->toReadableSize(0); // Retornará '0 Bytes'
$number->toReadableSize(1); // Retornará '1 Byte'
$number->toReadableSize(10240); // Retornará '10 KB'
$number->toReadableSize(21411921.92); // Retornará '20.42 MB'

toPercentage: simplesmente coloca o sinal % no final. É opcional informar a precisão como segundo parâmetro. Exemplos:

1
2
$number->toPercentage(50.4563); // Retornará 50.456%
$number->toPercentage(50.421, 2); // Retornará 50.42%

format: O primeiro parâmetro corresponde ao número. O segundo, opcional, corresponde as opções que você deseja para formatar o número. Neste parâmetro você passa um array com as opções, onde você pode configurar o seguinte:
 - before: texto que vai na frente do número. O padrão é ‘$’;
 - places: número de casas decimais. O padrão é 2;
 - thousands: símbolo de separação de milhares. O padrão é ‘,’;
 - decimals: símbolo de separação de decimais. O padrão é ‘.’.
 - after: texto que vai atrás do número. O padrão é vazio;
Exemplos:

1
2
3
4
$number->format(50); // Retornará '$50.00'
$number->format(50.25); // Retornará '$50.25'
$number->format(50.25, array('decimal'=>',')); // Retornará '$50,25'
$number->format(2050.25, array('after'=>'', 'before'=>'', 'thousands'=>'.', 'decimal'=>',')); // Retornará '2.050,25'

currency: transforma um número em valor monetário. Como segundo parâmetro, é opcional informar a unidade monetária. Atualmente, o CakePHP suporta apenas 3: USD (Dólar americano), GBP (Libra esterlina) e EUR (Euro). Já fiz o pedido para o pessoal de desenvolvido para incluírem o BRL (Real Brasileiro), mas acredito que só entre na versão 2.0. Mesmo não tendo a moeda brasileira ali, é possível usar o terceiro parâmetro, que então você pode definir as mesmas configurações de format e mais:
 - zero: valor neutro da moeda. O padrão é ‘0′;
 - negative: como será apresentado valores negativo. Caso seja configurado ‘()’, ele irá colocar o número entre os parênteses, caso contrário irá colocar o valor na frente do número (por exemplo ‘-’ acarreta em ‘-R$100,00′). O padrão é ‘()’;
 - escape: ignorar códigos HTML. O padrão é verdadeiro (true).
Além disso, o padrão de ‘before’ aqui é vazio e não ‘$’. Valores entre -1 e 1 serão colocados em centavos, portanto é necessário definir o valor de ‘after’. Exemplos:

1
2
3
4
$number->currency(10.20); // Retornará '10.20'
$number->currency(10.20, 'USD'); // Retornará '$10.20'
$number->currency(0.56, 'USD'); // Retornará '56c'
$number->currency(345323.234, '', array('after'=>'R$', 'thousands'=>'.', 'decimals'=>',')); // Retornará 'R$345.323,23'

É isso aí… Qualquer coisa é só perguntar.

22 maio 2008

renderElement defasado

Arquivado em: CakePHP — Tags:, , , , — Juan Basso @ 9:56 pm

Na segunda-feira desta semana (19/05/2008, revision 6978), o método renderElement da View tornou-se defasado, ou seja, não é mais aconselhado seu uso. No lugar deste método, deve-se usar o método element. Os parâmetros continuam os mesmos, só trocou o nome mesmo.

Para quem tem seus códigos com a função renderElement, preparem-se para substituir caso atualizem a versãodo Cake. Em códigos, fica o seguinte:

1
2
3
4
5
// Antigamente em uma view
$this->renderElement('elemento', $params);
 
// Agora na view
$this->element('elemento', $params);

Novas opções de validação

Arquivado em: CakePHP — Tags:, , , , , — Juan Basso @ 12:14 am

Este post é baseado no post Three new validation rules, de Daniel Hofstetter.

Recentemente foram incluídas novas regras de validação. Com isso, você pode usar três novas regras de validação nos seus models: boolean, inList e time.

boolean é auto-explicativa: testa se o valor é booleano (0 ou 1, false ou true, ‘0′ ou ‘1′).

1
var $validate = array('is_enabled' => array('rule' => array('boolean')));

inList é para verificar se um valor está dentro de uma lista.

1
var $validate = array('cor' => array('rule' => array('inList', array('vermelho', 'verde', 'azul'))));

time determina se o valor informado está num formato de hora válida.

1
var $validate = array('hora_inicial' => array('rule' => array('time')));

 
Para complementar, criei o ticket 4727 para que coloquem nas regras de validação os formatos brasileiros. São três formatos específicos: postal code (nosso CEP), phone (formato de telefone. Coloquei com código internacional, código de área e telefone, além de 0300, 0800 e 0900) e ssn (não é muito igual, mas coloquei a regra do CPF, que é o similar aqui no Brasil). Quando sair o resultado eu informo a vocês.

20 maio 2008

Personalizando páginas de erro

Arquivado em: CakePHP — Tags:, , — Juan Basso @ 10:24 pm

Muitos já devem ter visto as clássicas frases: “Missing Controller”, “Missing Model”, e por aí vai. Você sabe o que significa, mas será que seus clientes ou usuários sabem o que isso quer dizer? E será que sabem que isso é uma mensagem de erro?

Bem, para alterar essas telas de erro, basta criar alguns arquivos de view e colocá-los na pasta app\views\errors. Cada um tem um nome específico, são eles:

  • error404.ctp – Quando não é encontrado algum arquivo ou é lançado propositalmente um erro de não encontrado por um controller;
  • missing_controller.ctp – Quando está faltando um controller;
  • missing_action.ctp – Você digitou no navegador uma url que exista o controller, mas não a action nele. Exemplo: http://site/usuarios/acesso. No caso existe o controller UsuariosController, mas ele não tenha o método acesso;
  • private_action.ctp – Quando há o método no seu controller, mas ele é privado. Isso pode ser de duas maneiras, ou ele é privado pelo PHP 5 ou ele começa com _ ou __;
  • missing_component_file.ctp – Quando um controller tentou usar um component e este não exista fisicamente;
  • missing_component_class.ctp – Quando o arquivo de component existe, mas não contém a classe do component. Exemplo: você incluiu no seu controller o component‘Xxx’, existe o arquivo app\controllers\components\xxx.php, mas dentro dele há uma outra classe ou está vazio;
  • missing_view.ctp – Quando está faltando um arquivo de view (correspondente ao action do controller);
  • missing_layout.ctp – Quando está faltando um layout escolhido (incluindo o padrão);
  • missing_helper_file.ctp – Mesmo caso da falta de arquivo de component, mas para helper;
  • missing_helper_class.ctp – Mesmo caso da falta de classe de component, mas para helper;
  • missing_model.ctp – Faltando arquivo ou classe de model;
  • missing_table.ctp – Quando uma tabela não foi encontrada no banco de dados;
  • missing_connection.ctp – Quando não foi possível conectar no banco de dados;
  • missing_scaffolddb.ctp – Quando um scaffolding falha a conexão com banco de dados;
  • scaffold_error.ctp – Quando o método _scaffoldError não foi encontrado no seu controller.

Lembrando que todos os erros vem dentro do layout padrão.

Abraços e espero que não ocorram erros nos seus programas. :-)

Posts mais antigos »

Powered by WordPress