Tratando erros em PHP

Luis Filipe Costa Carvalho

Depois que um sistema é produzido ele vai para o ambiente de testes e, nem sempre, todas as possibilidades são testadas e todas as falhas são descobertas. Alguns erros passam daqui, outros dali e o site vai para um ambiente real funcionando 90%. É muito difícil um site sair da produção sem nenhuma falha. Mas ai esta a questão. Se ele der erro em ambiente real, como ficar sabendo?

Provavelmente pensando nisso o pessoal da Zend implementou a função set_error_handler, que serve para tratar erros gerados em tempo de execução.

Por exemplo, se você usar uma variável que não existe ou dividir um número por zero esta função será chamada e você trata o erro da forma que achar melhor.

Nos sites que eu desenvolvo normalmente eu uso esta função para tratar os erros:

set_error_handler('trataErro');

function trataErro($msg,$errno,$errstr,$errfile,$errline) {
   $msg ="<pre>
              \nErro....: [$errno] - $errstr
              \nDate....: ".date("d/m/Y H:i:s") . "
              \nFile....: <b>$errfile</b> : <b>$errline</b>\n
          </pre>
          <h2>Roll Back: </h2$gt;";

       $trace = debug_backtrace(); //pegando o backtrace da execução
       foreach ($trace as $k=>$v) {
           if ($v['function'] == "trataErro") continue;
           $msg .=  "<ul><li>Função: <b style=\" color: green\">" . $v['function'] . "</b></li></ul>
                   <ol>File: " . $v['file'] ."</ol>
                   <ol>Linha: " . $v['line'] ."</ol>";

           if (isset($v['args'])) {
               $msg .=  "Argumentos:<ul>";
               foreach ($v['args'] as $a) {
                   $msg .=  "<li>$a</li>";
               }
               $msg .=  "</ul>";
           }
       }

    ob_start(); //ligando buffer de saida
    echo "<h1> Variáveis Globais </h1>";
    echo "<h2> _SERVER </h2>";
    echo "<pre>\n";print_r($_SERVER);echo"</pre>";
    echo "<h2> _POST </h2>";
    echo "<pre>\n";print_r($_POST);echo"</pre>";
    echo "<h2> _GET </h2>";
    echo "<pre>\n";print_r($_GET);echo"</pre>";
    $msg .= ob_get_contents(); //pegando o conteúdo do buffer de saida
    ob_end_clean(); //limpando o buffer de saida
    echo $msg;
    die; //Se algum erro existir ele aborta a execução do script
}

Depois de gerada a mensagem, se o site estiver em ambiente real ele mostra uma mensagem falando sobre o erro e pedindo desculpas e se estiver em ambiente de teste ele mostra o erro da forma como eu organizei na função.

O uso deste tipo de função é simples e trás grandes ganhos para os programadores que conseguem ter um feedback de como esta o código do site.

Aprovado!, Desenvolvimento, Interessante, Leu? Comente!, PHP 6 Comentários

Uso de banda

Luis Filipe Costa Carvalho
Uso de banda do Google

Eu já sabia faz um tempo que o layout do Orkut iria mudar. Quando ele trocou, a primeira coisa que eu fui ver é se eles estavam usando webstandards. Vi que ainda usam algumas tabelas para os cantos arredondados e fiquei pensando… Já pensou na economia de banda feita se o site do Google, que é usado mundialmente, fosse desenvolvido usando esta metodologia? E se fossem todas as páginas de todos os serviços que ele disponibiliza? Isso me intriga até hoje.

Já não é de hoje que sabemos que um desenvolvimento semântico e usando padrões. Agora, se ele reconhece isso como uma vantagem em sites indexáveis, porque ele não usa isso no próprio desenvolvimento? Alguém sabe?

Comentem! =)

Desenvolvimento, Leu? Comente! 7 Comentários

Laço infinito

Luis Filipe Costa Carvalho

Vejo muita gente fazendo laço infinito de muitas formas. Por exemplo:
for($i = 1; $i < = -1; $i++){
//codigo
}

Ou
$i = 101;
while($i >= 100){
//código
}

Pois bem. Eu sei que isso não vai mudar a vida de ninguém mas um laço infinito é simples e facil, sem pequenas equações e raciocinios rápidos.

Que tal usar o
for(;;){
//código
}
? =)
Mais simples, mais rápido, mais fácil. Letal! =)

Cotidiano, Desenvolvimento, Interessante 8 Comentários

Classe que lista arquivos

Luis Filipe Costa Carvalho

Depois de algum tempo sem postar, hoje decidi postar este artigo que estava no “gatilho” faz algum tempo =)

Aqui na agência onde eu trabalho tive que fazer uma classe que lista os arquivos de uma determinada pasta de todas as suas pastas “filhas”. Para fazer isso decidi fazer uma classe que retornasse todos os arquivos de forma simples, eu aponto a pasta e a classe me retorna o caminho de todos os arquivos que tem dentro dela.

Coloquei a classe aqui no blog mas não ficou muito boa não, então eu decidi, além de deixar a classe aqui, colocar em um arquivo de texto e fazer link.

< ?php
class buscaArquivos{
    private $_pasta;
    private $_filtro = array();
    public $_arquivos = array();

    /*
        Contrutor da classe, ele cria o objeto seta a pasta de procura da classe como a
        pasta raiz do site
    */
    public function buscaArquivos(){
        $pasta = ereg_replace(DIRECTORY_SEPARATOR."+", DIRECTORY_SEPARATOR , $_SERVER['DOCUMENT_ROOT']."/");
        $this->_pasta = $pasta;
    }

    /*
        função que retorna a atual pasta de consulta da classe
    */
    public function getPasta(){
        return $this->_pasta;
    }

    /*
        função usada para setar a pasta em que a busca sera feita
    */
    public function setPasta($pasta){
        if($pasta != "") $this->_pasta = $pasta;
    }

    /*
        função que retirna o nomero de arquivos encontrados pelas busca
    */
    public function getNumeroArquivos(){
        return count($this->_arquivos);
    }

    /*
        função que retorna true se a extensao passada por parametro
        se ela constar na lista de filtro
    */
    public function checkFiltro($extensao) {
        return in_array($extensao, $this->_filtro);
    }

    /*
        retorna os arquivos que forma encontrados na busca
    */
    public function getArquivos(){
        return $this->_arquivos;
    }

    /*
        função que adiciona uma extensao aos filtros da busca, a busca não vai retornar os arquivos com a extensao adicionada
    */

    public function addFiltro($extensao){
        if(!in_array($extensao, $this->_filtro))
            $this->_filtro[] = trim($extensao);
    }

    /*
        função que verifica se a pasta é um diretório , se sim ela executa a função que faz a busca
    */
    public function procura(){
        if(is_dir($this->_pasta)){
            $this->listaArquivos($this->_pasta);
        }
    }

    /*
        função recursva que faz a busca
    */

    private function listaArquivos($dir){
        $handler = opendir($dir);
        while (false !== ($file = readdir($handler))) {
            if(!eregi("^[.]+$", $file)){
                if(!is_dir($dir."/".$file)){
                    if(!empty($this->_filtro)){
                         if(!in_array(strtolower($this->getExtensao($file)), $this->_filtro))
                             $this->_arquivos[] = ereg_replace(DIRECTORY_SEPARATOR."+", DIRECTORY_SEPARATOR , $dir.$file);
                    }else
                         $this->_arquivos[] = $dir.$file;
                }else $this->listaArquivos($dir.$file."/");
           }
        }
        unset($handler);
    }

    /*
        função que retorna o caminho não absoluto do arquivo
    */
    public function retornaLink(){
        $this->_arquivos = str_replace($_SERVER['DOCUMENT_ROOT'], "" , $this->_arquivos);
    }

    /*
        função que retorna apenas o nome do arquivo e a extensao do arquivo
    */
    static function retornaNome($iArquivoNome){
        $iNome = explode("/",$iArquivoNome);
        $iNome = end($iNome);
        return $iNome;
    }

    /*
        função que retorna o tamanho do arquivo, recebido por parametro, em KB
    */
    static function retornaTamanho($iArquivo){
        return number_format(filesize($_SERVER['DOCUMENT_ROOT'].$iArquivo) / 1024,2,",",".");
    }

    /*
        função que retona a extenção do arquivo recebido por parametro
    */
    static function getExtensao($iArquivo){
        $extensao = explode(".",$iArquivo);
        return end($extensao);
    }

}

$arq = new buscaArquivos;
$arq->addFiltro("php");  //adiciona o filtro para a extensao php, assim ele não ira lista os arquivos com esta extenção
$arq->procura(); //efetua a busca na pasta determinada
echo "$arq->getNumeroArquivos() "; //monstra o número de arquivos que a busca encontrou.

?>

Download da classe que lista arquivos de uma pasta

Esta classe me trouxe grande benefícios e grande facilidades com operações deste tipo. Espero que possa ajudar a voce também e que voce.

QUALQUER elogio, sugestão ou critica será bem-vindo =)

Classes, Desenvolvimento, Interessante, Leu? Comente!, PHP 2 Comentários

Preconceito entre os Sistemas Operacionais

Luis Filipe Costa Carvalho
Preconceito entre os Sistemas Operacionais

Já faz um tempo que eu uso Linux e o recomendo à todos que me perguntão sobre SO. Li um artigo sibre Linux x Windows do Gilberto Jr
e cheguei a uma conclusão.
Existe preconceito no mundo dos sistemas operacionais. De um lado temos os usuários e defensores de Linux, e do outro os usuários e defensores do Windows. Criticas fortes ja vem acontecendo faz um bom tempo da parte Linux das coisas para a parte Windows. Não é mais uma coisa rara ouvirmos a palavra “ruindows” ou comentários do tipo, você usa windows?! Que me… Entre em um canal de Linux no mIRC por exemplo. Do lado das janelas as criticas não são tão fortes assim. Eles simplesmente apontão quais as vantagens no uso do Windows ao linux. Eles reclamão com razão, tocando sempre em alguns poucos pontos em que o pinguim peca como por exemplo o “fraco” suporte a emulação dos programas como Photoshop ou Flash. Porém existe uma espécie de preconceito na cabeça dos “paladinos linuxzianos” .

Quando lemos algum artigo que fala mal do “janelas” normalmente não encontramos defensores da causa fazendo auê nos comentários ou mandando e-mails com, muitas vezes, mal criações e chingamentos. Esta cena se inverte quando falamos de linux. recentemente o Gilberto escreveu um post no Webinsider falando dos 10 Motivos para Preferir o Windows ao Linux e os destemidos defensores pinguins já começaram a atacar.

Fazendo uma comparação entre raças o Linux são os negros e o Windows os brancos. O preconceito dos usuários Windows para com os usuários Linux esta na cabeça dos usuários Linux. Quando alguém fala mal do Linux as pessoas agem como se ninguém pudessem ter oportunidade de se expressar e normalmente não vejo isso acontecer do lado oposto da coisa. Eu uso os dois sistemas operacionais e acho que as pessoas tem que parar de IMPOR sua “religião” no mundo das maquinas como se fossemos testemunhas de jeová. A verdade é simples. Cada sistema tem sua vantagem e sua finalidade e cabe a cada um escolher o sistema que mais atende a sua necessidade.

Assuntos Aleatórios, Cotidiano, Desenvolvimento, Leu? Comente!, Linux, Windows 4 Comentários
Icons by N.Design Studio. Designed By Ben Swift. Powered by WordPress and Free WordPress Themes
RSS RSS dos Comentários Login