Atenção

Seu navegador (Internet Explorer, Firefox, etc) não suporta CSS ou este recurso está desabilitado.

Não é possível acessar corretamente esta página sem ele.




Início
Monitorando erros em sites PHP via RSS Imprimir E-mail
Tag it:
Delicious
Furl it!
Spurl
NewsVine
Reddit
YahooMyWeb
Technorati
Rec6
Digg
Por Antonio Jozzolino   
20 de dezembro de 2006

Innovation Award Nominee

Medalha de Prata no phpclasses.org

Como monitorar erros que possam surgir em um sites publicados? Por e-mail? Que tal via RSS e usando o log gerado pelo próprio PHP?

Quando lançamos um site, pensamos: missão cumprida. “Próximo!!!” Mas não é bem assim. Apesar dos testes, é somente quando ele estiver funcionando que alguns erros imprevistos aparecerão.

Como monitorar estes erros? Usei e-mail durante anos, mas não é uma boa, pois você tem que especificar no próprio código que tipo de erro quer ser notificado:

 
$link = mysql_connect('mysql_host', 'mysql_user', 'mysql_password') or
die(mail(“meuemail @ meusite.com”, “Epa! Um erro ocorreu!”, mysql_error());

Ou, pior ainda:

$link = mysql_connect('mysql_host', 'mysql_user', 'mysql_password') or
die(echo mysql_error());

Isto seria entregar o ouro para o bandido. Erros devem ser escondidos. Não por uma questão de ego ou mesmo marketing pessoal, mas sim para proteger seu site de invasores e pessoas mal intencionadas. Lembre-se: quanto menos informação seu inimigo tiver, melhor.

Por outro lado, você precisa saber as falhas do seu site para poder corrigi-las. Bem melhor do que receber um telefonema do seu cliente reclamando...

Foi pensando nisso que escrevi essa classe bem simples, mas que quebra um galhão e te mantém informado, de maneira organizada, do que está rolando no seu site.

Depois de instalada, você receberá feeds dos erros, avisos e notificações do seu site, como a tela capturada abaixo, usando o Google Reader.

Como você pode ver, a classe reproduz a notificação e mostra a linha que apresentou problemas. Além disso, se você clicar no título do erro, ele abrirá o arquivo na sua cópia local do site para edição. Isso funcionou bem com o Sage, a extensão do Firefox. Mas não com leitores on line, como o Google Reader ou o Bloglines, pois eles alteram o código. Isto está na lista de melhorias para próxima versão. J

Agora, olhe só isso:

É aqui que mora o perigo. Veja que nosso amiguinho tentou injetar um código externo, aproveitando-se de uma vulnerabilidade do Mambo. É um bug que permite um ataque de Code Injection: a variável $spb não está sendo tratada. E você nunca saberia disso, a menos que olhasse o arquivo de log do PHP.

Preparando o sistema

Antes de tudo, você vai precisar alterar algumas coisinhas no php.ini. Isto significa que você tem que ter ou um servidor próprio ou um host que lhe permita acesso via shell. Felizmente, a Dreamhost permite isso. Se você tem conta na Dreamhost ou pretende ter, aqui estão as instruções para você configurar seu próprio php.ini. Basicamente, você precisará editar o seguinte no seu php.ini.:

 
error_reporting = E_ALL
display_errors  = off
log_errors      = On
error_log       = "/home/user/domain/.logs/.error_log"

Coloque o arquivo de erro em um local que não tem acesso externo, por segurança. Não coloque no mesmo diretório do seu site. Comece o arquivo com um “.”, para ele ficar oculto. Todo cuidado é pouco. É importante definir um local fixo para o arquivo de log. Gozado que eu não achei nenhuma referência sobre isto no manual do PHP. Se você não discrimina o caminho do arquivo, ele vai espalhar arquivos de log por todos os diretórios do seu site!

Feito isto, baixe o arquivo da classe. Centralizei lá no phpclasses.org para facilitar a manutenção do software. A instalação é super simples, mas se você tiver problemas, dê uma olhadinha na documentação da classe.

Descompacte o arquivo em um diretório da sua escolha. Depois crie um arquivo com um nome “secreto”, não obvio, e coloque as seguintes linhas:

Arquivo nadahaver.php

 
include_once('RSSerror.php');
$args = array( "root"        => "/home/.gizelle/aajj/sgd.com.br/",
               "local"       => "file:///C:/Documents%20and%20Settings/SeuNome/My%20Documents/SeuSite/",
               "log" => "/home/user/domain/.logs/.error_log",
               "url" => "http://www.seusite.com.br/",
               "lines" => 5,
               "password" => "123456"
             );
 
$param = array( "encoding"    => "UTF-8",
                "language" => "pt-BR",
                "title" => "Error Report for www.seusite.com.br", 
                "description" => "Please corrects some errors occurred in the site www.seusite.com.br",
                "stylesheet" => "http://www.seusite.com.br/class_RSSerror/rsserror.css",
                "stylesheet" => "",
                "link" => "http://www.seusite.com.br/"
              );
$rss = new RRSerror($args, $param);

Para ver o resultado, no seu agregador, adicione o FEED:

http://www.seusite.com.br/nadahaver.php?p=123456

Segurança

Pesquisei sobre segurança em feeds e o que existe é agregadores que suportam autenticação via servidor, como a do apache. Google Reader e Bloglines não aceitam. Mesmo que aceitassem, a segurança seria praticamente a mesma desta que eu implementei. Afinal, os dados iam trafegar abertos na rede. Se alguém estiver sniffando sua conexão, pegaria tanto de uma forma quanto da outra.

Por isso, a melhor política é:

  1. Manter um nome difícil no arquivo, que não tenha nada haver com o resultado que mostrará;
  2. Colocar uma senha difícil também, beeeem diferente do exemplo acima;
  3. Colocar o arquivo do log fora do acesso público;
  4. Colocar arquivos com senhas fora do acesso público, como senhas de banco de dados;

E, claro, desabilitar algumas coisas no seu php.ini

 
expose_php        = Off
safe_mode         = On
disable_functions = exec,passthru,shell_exec,system,escapeshellarg,escapeshellcmd

Há, entretanto, uma alternativa boa que pretendo implementar futuramente, que é criptografar o próprio conteúdo do Feed. Mas esta solução requer obrigatoriamente o Firefox e o Greasemonkey. `

Mas isto não é exatamente um problema, não é? J

Ah, é importante que suas páginas não tenham o comando init_set(“display_errors”, 0), senão os arquivos de log não serão gerados.

Este script é novo e pode haver bugs. Se você encontrar algum, avise. Estou usando há um 1 mês em dois sites e até agora tudo bem. Para comentar bugs, deixe um comentário.

Update [03/01/2006 08:32:00]

Fiquei bastante contente ao saber que esta classe foi indicada para ganhar o Prêmio de Inovação de dezembro, do site www.phpclasses.org.

Innovation Award Nominee

December 2006 Number 2

"Error logs are important to determine when something wrong happened with an application. Inspecting error logs may require special access to the server, which sometimes it may not be possible to access. This class provides an interesting solution that consists in serving error logs as RSS feeds. This way, the logs may be inspected using a Web browser that supports displaying RSS feeds."

Manuel Lemos

Se for escolhida, ótimo. Será um incentivo a mais para melhorar a idéia. Mas só o fato de ser indicada, já é uma honra e satisfação enorme.

Conheça as classes que estão concorrendo no site www.phpclasses.org.

Update [02/02/2007 11:28:00]

Medalha de prata! Uhhuhh, esquindô, ueueueue!!! Fiquei em segundo lugar junto a classe Session in Cookies. Legal, é um grande incentivo! Obrigado a todos que votaram na minha classe, espero que seja útil. E parabéns ao vencedor, o Khaled Al-Shamaa com sua classe ArDate, e a todos que participaram também! Achei muito divertido! Adora dá licença que preciso contar para minha mãe. Ops! Será que foi ela que votou? Sealed


Publique este artigo no seu site | Visto: 28019 | Imprimir

Comentários (10)
Comentários em RSS
1. 16-01-2007 08:20
 
Muito bom mesmo essse macete você esta de parabens espero poder encontar mais de suas matéria.
 
Edinaldo
2. 03-02-2007 20:03
 
Parabéns pela inciativa e pelo prêmio 
 
Pena que eu não posso usar, já que não posso alterar os php.ini 
 
Não teria como ter uma rotina que gerasse um arquivo de log ? 
 
tipo die(GeraLog('erro sql tal', mysql_error())) 
 
e a classe beber desse log gerado pelo php e não pelo servidor 
 
e mais uma vez parabéns
 
dprogrammer
3. 04-02-2007 14:10
 
Tente a classe Class: ErrorHandler www.phpclasses.org/browse/package/345.html
 
Ela é muito boa, apesar da documentação ser meio falha, como muita coisa é no mundo do software livre. 
 
Porém, nenhum programa de rastreamento de erros e logs feitos na própria linguagem conseguirá detectar os erros fatais. Apenas os 'notices' e 'warnings'. 
 
Foi exatamente por isso que escrevi esta classe. Já pensou em mudar de servidor? É muito limitante não ter acesso ao shell do sistema e outras facilidades que a maioria dos hosts internacionais provêm.
 
Antonio Jozzolino
4. 04-02-2007 16:04
 
blz, vou dá uma olhada nessa classe e também confirmar com os dois provedores que tenho conta se posso editar o php.ini 
 
Estava pensando em aproveitar esse código para monitorar os erros que acontecem nas aplicações windows que desenvolvo. Já existe uma rotina que captura os erros e grava uma imagem junto com um txt contendo a descrição do erro. Aí eu poderia utilizar sua classe. Eu gravaria os erros na net e depois checava via RSS. Poderia ser um webservice que criasse esse arquivo de log ou uma pagina php mesmo, passando os parametros via POST ou GET. 
 
Ainda não olhei a classe que vc fez e nem olhei o arquivo de log que o servidor gera. É moleza eu gerar um arquivo de log no mesmo padrão do arquivo gerado pelo servidor ? 
 
Assim que possível vou dá uma estudada nessa classe. Esse lance de verificar os erros via RSS é massa d+, parabéns.
 
dprogrammer
5. 04-02-2007 16:05
 
Você pode gerar seu arquivo de log no padrão do PHP, ou vc pode fazer um fork da minha classe e incluir uma função específica que leia o log no formato que você quiser. Veja a documentação da classe em www.sgd.com.br/docs/class_RSSerror/ 
abraço e obrigado pelo incentivo.
 
Antonio Jozzolino
6. 05-03-2007 13:48
 
Ideia merecedora de premio mesmo... as configurações do php.ini dá pra alterar em tempo de execução tambem... 
 
ini_set('error_reporting', 'ALL'); 
ini_set('log_errors', true); 
ini_set('display_errors', false); 
ini_set('error_log', '/home/user/domain/.logs/.error_log'); 
 
Parabéns pela ideia
 
Fábio
7. 05-03-2007 14:13
 
Boa dica, Fábio. Especialmente útil para quem não tem acesso ao php.ini. 
 
Pesquisei em php.net/ini_set e todas essas diretrizes que você listou estão marcadas como 'PHP_INI_ALL', o que significa que podem ser alteradas em qualquer lugar, mesmo no .htaccess, se o Apache estiver configurado de modo a permitir isto.
 
Antonio Jozzolino
8. 21-05-2007 00:32
 
Adorei o artigo, e ja estou utilizando ele. 
 
Mas estou com problemas .. no Sage a página com os problemas aparece normalmente, consigo ver os erros e tudo mais .. 
 
Mas no google reader nem le os problemas .. 
 
isto acontece contigo ? Teve que mexer em algo nas bibliiotecas do RssError ? 
 
valeu
 
Diogo Pires
9. 20-05-2007 09:09
 
Diogo 
 
Aqui funciona normal no Google Geader. Veja que até usei como exemplo para as telas capturadas. 
 
O que não funciona é abrir a cópia da página que apresenta problemas para edição. Isso só no Saje ou eu outro programa que rode off-line. 
 
Será que você colocou a URL completa, inclusive com a senha? 
 
abraço 
 
Antonio
 
Antonio Jozzolino
10. 26-10-2009 10:11
 
Eu tentei Feedzilla e achei as notícias atualizadas instantaneamente para o meu site. Feedzilla, na minha opinião, é o melhor fornecedor de feed de notícias ao redor. Eu recomendo check-out no br.feedzilla.com
 
Este endereço de e-mail está sendo protegido de spam, você precisa de Javascript habilitado para vê-lo

Só usuários registrados podem comentár.
Registre o faça o login.

Powered by AkoComment Tweaked Special Edition v.1.4.6
AkoComment © Copyright 2004 by Arthur Konze - www.mamboportal.com
All right reserved

Última Atualização ( 29 de julho de 2007 )
 
Tag it:
Delicious
Furl it!
Spurl
NewsVine
Reddit
YahooMyWeb
Technorati
Rec6
Digg
< Anterior   Próximo >