PHP 5 - Trabalhando com Arquivos e Diretórios com classe

Uma das features mais legais do PHP 5 são os chamados Iterators, tem pra tudo, array, diretórios, XM … dando uma olhada na página do manual, você pode ter uma listagem completa, inclusive com exemplos de uso. Futuramente, pretendo falar sobre todos, mas a bola da vez é o DirectoryInterator.

O DirectoryIterator, é obviamente, para trabalhar com diretórios e arquivos. Com ele, você pode facilmente - e obviamente, orientado a objetos - trabalhar com o conteúdo de um diretório.

Um exemplo de uso:

<?php
// diretório atual do script
$strDiretorio = __DIR__;

// instancio a classe informando o diretório
$objDiretorio = new DirectoryIterator($strDiretorio);

// percorro o conteúdo do diretório
foreach($objDiretorio as $objDiretorioConteudo) {
    echo $objDiretorioConteudo->getPathname() . PHP_EOL;
}

Abaixo, listo alguns métodos que você pode usar no $objDiretorioConteudo do exemplo acima:

Pegar a data de modificação: getMTime() Pegar a data de criação: getCTime() Verficiar se é um diretório: isDir() Verificar se é um arquivo: isFile() Verificar se é um arquivo oculto (começa com ponto, no Linux): isDot() Verificar se é um link: isLink() Verificar as permissões: getPerms() Recuperar o tamanho do arquivo: getSize() Verificar se é um executável: isExecutable() Verificar se existe a permissão de leitura: isReadable() Verificar se existe a permissão de gravação: isWritable()

Na página do manual, você pode obter uma listagem completa dos métodos, dá uma passada lá.


Otimizando o consumo de memória do NetBeans

Outro dia, aborrecido com o alto consumo de memória do NetBeans no meu Netbook, resolvi procurar informações a respeito de otimizações (sim, eu sou um baita fominha quando se trata de espaço em disco e memória, acho que culpa de sempre ter usado máquinas podreiras). De tanto fuçar, acabei chegando na seguinte configuração para o meu netbeans.conf - no Ubuntu, ele fica em /usr/local/netbeans-*/etc/:

netbeans_default_options="-J-client -J-Xss2m -J-Xms128m -J-Xmx256m -J-XX:PermSize=128m -J-XX:MaxPermSize=1000m -J-XX:+UseConcMarkSweepGC -J-XX:+CMSClassUnloadingEnabled -J-XX:+CMSPermGenSweepingEnabled -J-Dnetbeans.logger.console=true -J-ea -J-Dapple.laf.useScreenMenuBar=true -J-Dapple.awt.graphics.UseQuartz=true -J-Dsun.java2d.noddraw=true -J-da -J-Djava.net.preferIPv4Stack=true -Dsun.java2d.d3d=false -Dawt.nativeDoubleBuffering=true"

Os parâmetros acima são meio que auto-explicativos, mas em resumo, estou dizendo para o NetBeans:

  • usar por padrão o IPv4 (caso tenha problemas em fazer atualizações dos plugins, eu tive algumas vezes)
  • Esconder a janela irritante de Exceções do Java (comigo aconteceu muito na versão beta 2 do 7)
  • Usar o buffer dpulo nativo
  • Iniciar com 128Mb de reserva pra cache e etc e no máximo 1Gb para uso.

Bom, o resto você procurar né?

ps: Você também pode acrescentar: “–laf javax.swing.plaf.metal.MetalLookAndFeel” caso não queria usar o padrão GTK que ele põe, existem outros, basta procurar, pq no momento em que escrevo isso não me lembro dos outros :P


Enviando e-mails via Gmail com Zend_Mail

Configurar um servidor SMTP é trabalhoso, principalmente pela briga de gato e rato que é não cair nas listas negras e ser tratado como SPAM, confesso que não tenho muita paciência pra isso, apesar de já ter de faze-lo algumas vezes, mas se puder correr dessa alternativa, melhor ainda.

As vezes, tudo que precisamos é criar um formulário de contato simples para um pequeno site de cliente, ou mesmo apenas para nos enviar alguns avisos da aplicação. 

Classes para envio de e-mails existem aos montes, uma que gosto muito e recomendo é a PHPMailer, que já usei por algum tempo e nunca me deu trabalho. Mas como a algum tempo venho utilizando a Zend Framework em meus projetos, nada melhor do que utilizar o módulo já incluso na mesma para esta tarefa não é mesmo? Seguindo o passo a passo descrito abaixo, fica simples enviar e-mails. Vamos lá.

Primeiro, criamos um um arquivo chamado ‘smtp.ini’ em application/configs com o seguinte conteúdo:

; -------------------------------------------------
; | SMTP Host configuration
; -------------------------------------------------


[smtp]
smtp.titulo  = Título padrão para o e-mail
smtp.usuario = [email protected]
smtp.senha   = senha
smtp.host    = smtp.gmail.com
smtp.porta   = 465
smtp.seguranca = ssl
smtp.auth    = login

Agora, na action que vamos enviar o nosso e-mail, basta colocar o seguinte código

// busco as configurações no ini
$objCfg = new Zend_Config_Ini(APPLICATION_PATH . '/configs/smtp.ini', 'smtp');
$arrCfg = $objCfg->toArray();

// configuro o cliente SMTP
$config = array('auth'     => $arrCfg['smtp']['auth'],
                'username' => $arrCfg['smtp']['usuario'],
                'password' => $arrCfg['smtp']['senha'],
                'smtp'     => $arrCfg['smtp']['host'],
                'ssl'      => $arrCfg['smtp']['seguranca'],
                'port'     => $arrCfg['smtp']['porta']);

// instancio o cliente SMTP
$smtp = new Zend_Mail_Transport_Smtp($config['smtp'], $config);

// instancio o cliente de e-mail e tento enviar a mensagem
$mail = new Zend_Mail();
$mail->setFrom($params['email'], $params['nome'])
     ->setReplyTo($params['email'], $params['nome'])
     ->addTo('[email protected]')
     ->setBodyHtml('Teste de e-mail')
     ->setSubject($arrCfg['smtp']['titulo'])
     ->send($smtp);

// desconecto do host smtp
$smtp->getConnection()->disconnect();

Pronto, e-mail enviado!!! Agora é só fazer os tratamentos de campos, excessões e etc, conforme a necessidade da sua aplicação. ;)


Utilizando Rotas com Zend Framework

As vezes, é importante definir algumas urls mais amistosas para sua aplicação, ao invés de deixar o padrão “controller/action/nomeparametro/valorparametro”, isso as vezes pode confundir, além de ficar feio para um site por exemplo.

Para contornar isso, temos o Zend_Controller_Router_Route, que nos facilita o trabalho de criarmos as tais rotas, que é nome mas apropriado para este tipo de redirecionamento.

O uso é simples, vamos criar no diretório ‘application/configs’ um arquivo chamado ‘routes.ini’, e colocamos nele o seguinte conteúdo:

[routes]
routes.artigos.route = "artigos/:sessao"
routes.artigos.defaults.controller = artigos
routes.artigos.defaults.action = index

Entendeu? Não? Eu explico então cada linha. Onde está escrito ‘artigos’, é o nome da rota que estamos definindo. Um identificador único para a mesma. Logo em seguida, nos valores, definimos o caminho da rota, ou seja, nossa url, que seria ‘/artigos’ e seu parâmetro, que podem ser vários, bastando começar com ‘:’ (dois pontos). As outras linhas são auto explicativas.

Dentro do action que você apontou a rota, para receber o valor do parâmetro ‘:sessao’ por exemplo, basta utilizar um $this->_getParam(‘sessao’).

Em nosso Bootstrap, adicionamos um método para buscar automaticamente nossas rotas

protected function _initRouter()
{
    $this->bootstrap('frontController');

    $config = new Zend_Config_Ini(APPLICATION_PATH . '/configs/routes.ini', 'routes');

    $router = $this->getResource('frontController')
                   ->getRouter()
                   ->addConfig($config, 'routes');

    return $router;
}

Pronto, com isso, basta apontar sua url para ‘/artigos/nomedeumasessao’, e está definida sua rota personalizada. Você pode ir adicionando quantas rotas quiser em seu routes.ini.

Divirta-se ;)


Trabalhando com imagens utilizando a biblioteca Imagick

Qual programador nunca teve sua função ‘criaThumb’, ‘thumb’ ou parecida, utilizando aqueles terríveis - e chatos - cálculos e ‘ifs’ com GD não é mesmo? Pessoalmente, nunca gostei, utilizada por não conhecer outra alternativa, mas agora com a biblioteca Imagick isso ficou até massa de fazer.

Com ela, você pode não apenas criar miniaturas de imagens, mas também recuperar várias informações, recortar, redimensionar, inserir uma marca d’água, mesclar imagens, enfim, o limite é a sua imaginação.

A instalação é simples, no Ubuntu, basta dar um: ‘sudo apt-get install php5-imagick’ e pronto, o módulo esta lá, disponível pra uso. E você pode fazer horrores com esta biblioteca, abaixo vou citar um pequeno exemplo de uso:

<?php
// instancio a biblioteca informando a imagem como fonte
$objImagem = new Imagick('/tmp/minhafotogigante.jpg');

// seto a compressão como jpeg
$objImagem->setImageCompression(Imagick::COMPRESSION_JPEG);

// defino o nível de qualidade de compressão
$objImagem->setCompressionQuality(100);

// faço o thumbnail normal
$objImagem->thumbnailImage(120, 80);

// ou faço um thumbnail recortando
$objImagem->cropThumbnailImage(120, 90);

// ou recorto um pedaço da imagem
$objImagem->cropImage(120, 90, 0, 0);

// salvo a imagem em disco
$objImagem->writeImage('/tmp/minhafotopequena.jpg');

// recupero o mime-type (tipo) da imagem
$strImagemFormato = $objImagem->getImageFormat();

// seto corretamente o content-type no header e imprimo
header("Content-Type: image/{$strImagemFormato}");

echo $strImagem;

Viu, simples não? No manual existem várias outras opções de uso, e com certeza irão atender plenamente suas necessidades.