viernes, 2 de septiembre de 2011

Trackeando visitas usando fopen + gz + PHPMailer

En el Capítulo anterior: "saber quien visita tu web con solo unas lineas en php"  les enseñaba a trackear las visitas con unas líneas en PHP, ahora en esta entrega les voy a enseñar como purgar esos logs cuando alcancen una capacidad de 1Mb y al mismo tiempo enviarnos una copia del backup en formato de compresión gz a nuestro email valiéndonos de la líbreria PHPMailer la cual se readapto para que funcione con PHP 5 o superior.

Para cumplir con este objetivo el script anterior se modificó agregándole unas cuantas líneas adicionales, no por ello es significativamente mas extenso.

Veamos:

Vamos a necesitar 3 archivos para trabajar

1) visitas.txt (permisos 755, donde vamos a ir guardando a modo de base de datos los logs osea las visitas a la pagina)
2) class.phpmailer.php (la libreria PHPMailer propiamente dicho, para poder enviarnos el archivo comprimido como adjunto)
3) mylog.php (nuestro script php para trackear las visitas)

Para ser un poco más prolijos vamos a incorporar con un [b]include('mylog.php');[/b] en la página que vamos a trackear

<?php
error_reporting(0);
require_once('class.phpmailer.php');
function getRealIpAddr() {
if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
$ip=$_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
}else{
$ip=$_SERVER['REMOTE_ADDR'];
}
return $ip;
}
 function iComprimir($sFichOrigen, $iNivelComp = 8){
       
        $sFichDetino = $sFichOrigen.".gz";
       
        if ( ! $fOrigen = @fopen($sFichOrigen, "rb" ) )
            return false;
        $sOriBin = fread( $fOrigen, filesize($sFichOrigen) ) ;
        fclose($fOrigen);
       
        $sDesGZ = gzencode( $sOriBin, $iNivelComp ) ;
        if ( ! $fDestino = @fopen ($sFichDetino, "wb" ) )
            return false;
        fwrite($fDestino, $sDesGZ ) ;
        fclose($fDestino);
        return true;
       
    }
   
// Genero el log
$NombreArchivo='visitas.txt';
date_default_timezone_set('America/Argentina/Buenos_Aires');//seteo para que me de la fecha de mi pais
$fecha = date("d M Y H:i:s"  )  ;
$refer = $_SERVER['HTTP_REFERER'];
$consulta = $_SERVER['QUERY_STRING'];
$browser = $_SERVER['HTTP_USER_AGENT'];
$ruri = $_SERVER['REQUEST_URI'];
$fh=fopen($NombreArchivo,"a+"  )  ;// a+ hago un append para no machacar datos
$ip=getRealIpAddr () ;
fputs($fh,"$fecha|$ip|$refer|$consulta|$browser|$ruri\n"  )  ;
fclose( $fh ) ;
// Compruebo el tamaño del fichero si es mayor o igual a 1Mb lo comprimo,purgo y lo adjunto por email
$fsize=1048576;// 1 mb expresado en bytes
$k=filesize($NombreArchivo ) ;
if($k-->=$fsize){
if (iComprimir ($NombreArchivo, 9))
 {
   $f=fopen($NombreArchivo,"w" ) ;fclose( $f ) ;//purgo el fichero
// envio por email el log comprimido como adjunto usando la clase PHPMailer
$mail             = new PHPMailer(); // defaults to using php "mail()"
$body             = "<b>Tu log file!.</b>";
$body             = preg_replace("[/\/]",'',$body ) ;
$mail->AddReplyTo("miremitente@midominio.com","Logs Bck" ) ;
$mail->SetFrom('miremitente@midominio.com', 'Logs Bck' ) ;
$address = "recipiente-donde-mando-el-log@micta.com";
$mail->AddAddress($address, "Tu nombre o pagina" ) ;
$mail->Subject    = "Log de tu pagina";
$mail->AltBody    = "To view the message, please use an HTML compatible email viewer!"; // optional, comment out and test
$mail->MsgHTML( $body ) ;
$mail->AddAttachment("$NombreArchivo.gz" ) ;      // attachment
if(!$mail->Send()) {
  //echo "Mailer Error: " . $mail->ErrorInfo;
} else {
  //echo "Message sent!";}
$bck = "bck-".date("dMYHis" ) .".txt.gz" ;
rename ("$NombreArchivo.gz",$bck ) ;
}
}
}
?>
Cabe aclarar que en la próxima visita a la página donde este el script cuando el log visitas.txt alcance el tamaño de 1 Mb automáticamente va a comprimirse en gz, "limpiar" visitas.txt y enviar el log comprimido por email dejando una copia con nombre de archivo tipo fechahora por si ocurre algun error siempre quedara la copia en el server que luego la podemos borrar manualmente desde nuestro FTP.

El script esta autoexplicado, pueden mejorarlo como les guste
Reacciones:

1 comentarios:

halguien dijo...

el link ya no funciona maestro... podrías resubir el archivo?

gracias por el aporte, la verdad que es muy util!!