Foros del Web » Programando para Internet » PHP »

Script de log y gran BD

Estas en el tema de Script de log y gran BD en el foro de PHP en Foros del Web. Hola que tal a todos. Les explico el problema que he tenido ultimamente. Realize un Script, que se conecta via socket hacia un servidor de ...
  #1 (permalink)  
Antiguo 22/08/2006, 15:39
Avatar de DeeR  
Fecha de Ingreso: diciembre-2003
Ubicación: Santiago
Mensajes: 520
Antigüedad: 20 años, 4 meses
Puntos: 17
Script de log y gran BD

Hola que tal a todos.
Les explico el problema que he tenido ultimamente.

Realize un Script, que se conecta via socket hacia un servidor de juegos (Quake2), en el cual realiza una consulta rcon status y obtiene datos de los jugadores que estan jugando en el servidor. Esa informacion la guardo en una bd MySQL. Via cron se ejecuta cada 5 minutos.Entonces de esta forma tenemos un sistema completo de Log del servidor del juego.
Entonces si yo entro a jugar en el servidor, y juego durante media hora, tendre 6 registros anotados.
La base de datos tiene la siguiente estructura
id|servidor|ip|name|score|ping|ver|rate|mapa|hora

Por supuesto que el Script que hace consultas la BD, Pagina los resultados, tiene un buscador con comodines (Para buscar por IP, Nick,etc).
Entonces una misma IP tiene muchos registros, pero es importante, ya que nos interesa los nick que usa cada jugador.

El sistema ha funcionado muy bien,nos ha permitido saber que hay muchos jugadores que juegan por mas un clan en nuestra Comunidad de Action Quake 2.

El sistema lleva online ya casi 2 meses, tenemos 120.000 registros y pesa 12 MB :O :O.


Ahora necesitamos hacer un script que analize todos los registros de la base de datos (mas que nada las IP) y anote todos los nick que ha usado una IP.

Código PHP:
<?

include('../php/mysql.php');

function 
buscar($ip,$matriz)
 { 
// Buscamos el ip dentro de la matriz
  
$c='0';
  for (
$i=0;$i<count($matriz);$i++)
  {
      if (
$ip == $matriz[$i])
      {
      
$c++;    
      }   
  }
  if (
$c == '0' )
  {
  return(
'0');  
  }
  else
  {
  return(
true);  
  }
 
 }

$sql="SELECT `ip` FROM `aq2logservers`";
$result mysql_query($sql);
            
$k=0;
            while (
$row mysql_fetch_row($result))
            {
            if (
buscar($row[0],$ipgrabadas))
            {
            }else
            { 
// Entro
            
$ipgrabadas[$k]=$row[0];
                        
$k++;          
            
            }            
            }
        
// Tenemos Todas las IP grabadas distintas

for ($i=0;$i<count($ipgrabadas);$i++)
{
$sql="SELECT `name` FROM `aq2logservers` WHERE `ip` LIKE CONVERT( _utf8 '".$ipgrabadas[$i]."'
USING latin1 ) COLLATE latin1_swedish_ci"
;


        
$result mysql_query($sql);
        
$k=0;
        echo 
'IP:'.$ipgrabadas[$i].'<br>';
        while (
$row mysql_fetch_row($result))
        {
          
        if (
buscar($row[0],$nicktemporales))
            {
            }else
            { 
// Entro
            
$total[$k][0]=$ipgrabadas[$i];
            
$nicktemporales[$k]=$row[0];
            
$total[$k][1]=$total[$k][1]."|".$row[0];
            
$k++;
            echo 
''.$row[0].'<br>';
                      
            
            }     
        
        
        
        
        


        

        }
$nicktemporales="";
echo 
'<br><br><br>';
}        

?>
Lo que sucede, esque una IP puede tener 500 registros,entonces el script primero Toma todas las IP, luego crea una matriz con todas las IP no repetidas, y De hay hace la consulta de los nick para cada IP, Todos los nick de una IP los guardo en una matriz temporal, y solo los Nick que no se repitan los voy guardando $total[$k][1].

Entonces el resultodo es
$total[0][0] Seria la IP
$total[0][1] Lista de todos los nick que uso tal IP

Funciona super bien si inicialmente limito el numero de registro de 0 1000 o 2000, pero mas de eso el script es eterno en el servidor y sobrepasa los 30sec.

Entonces necesito ideas para optimizar el script, para realizar todo ese proceso, sin que sobrepase el tiempo maximo de ejecucion de un script.

O solo me queda la opcion de mover la bd de ami computador personal y aplicar el script y que trabaje eternamente hasta cuando termine hahaah (ya que localmente no tengo limitado el tiempo de ejecucion de un script).

Saludos amigos
  #2 (permalink)  
Antiguo 22/08/2006, 17:47
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
mm Pero por què creas esa "matriz"? .. con una consulta SQL condicional podrìas tener ya filtrado esos datos.

Algo tipo:

SELECT * FROM tabla WHERE id='$ip'

Tambien en SQL tienes sentencias como "DISTINCT" para tomar sòlo los datos "distintos" (que no se repitan).

SELECT DISTINCT ip,otros datos ... FROM tabla

Realmente no sé lo que quieres conseguir .. pero tu problema principal y su soluciòn va más por el lado de optimizar el SQL a emplear que no meter más PHP por médio. A lo que me refiero con esto es que das soluciones en PHP por usar un SQL (Lenguaje structurado de consultas) extremadamente básico .. (sin aprovechar tal vez el 100% de lo que el SQL te podría ayudar).

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:52.