Interceptando funções internas no PHP
Olá pessoal, dica rápida de como proceder para interceptar funções build-in no php.
Precisei usar para interceptar as chamadas da função mail, em um servidor em produção,
para gerar log, de abusos.
Para isso precisaremos instalar o modulo runkit, disponível em github.com/padraic/runkit.
O procedimento consiste em baixar o pacote via git, com o comando
git clonse git://github.com/padraic/runkit.git, executar um phpize no diretório, depois
o trio ./configure && make && make install
Feito isso basta configurar o php.ini para subir o modulo com as seguintes linhas:
extension=runkit.so
runkit.internal_override=1
A primeira linha carrega o módulo e a segunda, diz que vamos sobre-escrever funções internas no php.
Depois basta reiniciar o apache.
O script para interceptar fica mais ou menos assim:
//copiamos a funcao interna mail para o nome de intmail
@runkit_function_copy("mail", "intmail");
//removemos a funcao original mail
@runkit_function_remove("mail");
//atribuimos a funcao umail para o nome mail
@runkit_function_copy("umail", "mail");
//criamos a assinatura da funcao identica a original do mail
function umail($to,
$subject,
$message,
$additional_headers = null,
$additional_parameters = null) {
//executamos aqui nossas rotinas
//como por exemplo criar logs
//chamaos a funcao mail original com os paramentros passados
if (ini_get('safe_mode') === false){
$x = intmail($to,
$subject,
$message,
$additional_headers,
$additional_parameters);
} else {
$x = intmail($to,
$subject,
$message,
$additional_headers);
}
return $x;
}
Para esse scritpt ter um funcionamento global, é preciso adiciona-lo na configuração auto_prepend_file para
carrega-lo automaticamente em toda página.
Por hora é isso.
Abraços
July 16th, 2010 at 2:16 pm
Obrigado pela dica.
Parabéns pelo blog, bom conteudo.
E legal que és vizinho..heheh Tijucas/Camboriu é um pulo.
Abraços