Foros del Web » Programando para Internet » PHP »

leer ultimas lineas de archivo remoto grande

Estas en el tema de leer ultimas lineas de archivo remoto grande en el foro de PHP en Foros del Web. tengo en un ftp un archivo de log de 6mb, ke en ocasiones puede llegar a 20mb y no hay mayor latencia ni limitaciones de ...
  #1 (permalink)  
Antiguo 30/04/2008, 13:34
 
Fecha de Ingreso: agosto-2003
Mensajes: 52
Antigüedad: 20 años, 8 meses
Puntos: 0
leer ultimas lineas de archivo remoto grande

tengo en un ftp un archivo de log de 6mb, ke en ocasiones puede llegar a 20mb y no hay mayor latencia ni limitaciones de ancho de banda entre el hosting y el ftp.

Lo ke kiero hacer es leer las ultimas lineas de este archivo de log, de forma rapida.

Actulamente tengo un script ke lo hace localmente, pero al momento de hacerlo remoto, lee la primera linea del (por k es lo primero k llega), y arroja errores por ke aun no llega el resto del archivo.

Tonces como puedo leer estas lineas rapidamente?.
  #2 (permalink)  
Antiguo 30/04/2008, 14:45
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: leer ultimas lineas de archivo remoto grande

Tienes que aumentar el tamaño de tiempo de ejecución de tu script, ya que por defecto a los 30 segundos se corta.

Otra opción más rápida es crear un "servicio" donde tu solo le pidas las ultimas lineas y este lea el archivo del ftp via local y solo te entregue las ultimas lineas.

Saludos.
  #3 (permalink)  
Antiguo 30/04/2008, 14:50
 
Fecha de Ingreso: marzo-2008
Mensajes: 303
Antigüedad: 16 años, 1 mes
Puntos: 4
Re: leer ultimas lineas de archivo remoto grande

No se si se puede hacer en PHP, pero en PERL para ver las ultimas 10 líneas sería tan facil como ésto:
`tail -10 fichero`
  #4 (permalink)  
Antiguo 30/04/2008, 15:04
 
Fecha de Ingreso: agosto-2003
Mensajes: 52
Antigüedad: 20 años, 8 meses
Puntos: 0
Re: leer ultimas lineas de archivo remoto grande

Gatorv, No tengo problemas con el tiempo de ejecucion del script, el problema es ke como es remoto, se trasmiten las primeras lineas del archivo y el fseek toma como ultima linea, la primera ke encuentra (ke es la unica k se alcanzo a transmitir).

Tampoco puedo crear un servicio, por ke el archivo esta en un ftp externo, lo k busco es algo k emule al tail, lo cual no puedo hacerlo en perl, pk el archivo es remoto y no tengo soporte :p.
  #5 (permalink)  
Antiguo 30/04/2008, 17:43
Avatar de jam1138
/** @package Moderador */
 
Fecha de Ingreso: julio-2004
Ubicación: sèveR led onieR lE
Mensajes: 9.368
Antigüedad: 19 años, 9 meses
Puntos: 102
Re: leer ultimas lineas de archivo remoto grande

No entiendo bien la función del script que dices --entiendo-- te funciona en local y no en remoto. Quizá sería bueno mostrar el código.

Ahora, sugiero, ¿por qué no en lugar de emular "tail", haces uso de él?. Podrías mandarlo a ejecutar con la función exec() de PHP.

www.php.net/function.exec

__________________
٩(͡๏̯͡๏)۶
» Cómo hacer preguntas de manera inteligente «

"100 años después, la revolución no es con armas, es intelectual y digital"
  #6 (permalink)  
Antiguo 01/05/2008, 23:02
 
Fecha de Ingreso: agosto-2003
Mensajes: 52
Antigüedad: 20 años, 8 meses
Puntos: 0
Re: leer ultimas lineas de archivo remoto grande

haber, me funciona de forma local, por ke se abre el archivo directamente, pero al ser remoto el archivo primero debe transferirse desde una makina a donde ejecuto el script, es por eso k no puedo usar tail.

Imagina esto, tengo un archivo en un ftp ke contiene esto 123456, donde cada numero es una linea y kiero leer la linea 6.
El script de forma local habre el archivo y va directo a las 6, y funciona
Cuando es remoto, se habre el arhivo k empieza a transferirse, llega la linea 1 y esa es la ke cree k es la ultima (ya que aun no llega la 2), tonces falla.

La solucion de eso seria, especificarle a la funcion fopen, k en vez de comenzar a transmitir la linea 1, comience por la linea 6, o decirle ke solo kiero obtener los ultimos 100 kb (por ejemplo), del archivo.
Creo k me estoy convenciendo k es imposible.
  #7 (permalink)  
Antiguo 02/05/2008, 01:28
Avatar de jam1138
/** @package Moderador */
 
Fecha de Ingreso: julio-2004
Ubicación: sèveR led onieR lE
Mensajes: 9.368
Antigüedad: 19 años, 9 meses
Puntos: 102
Re: leer ultimas lineas de archivo remoto grande

... ya; Ss solo el archivo el que se encuentra en otra máquina, y no tienes acceso a aquella máquina, como para pensar en una solución de aquel lado.

A como lo cuentas el error es que estás intentando leer información que no tienes (pues el archivo está en transferencia)... pero ¿cómo estas leyendo dicho archivo?. Nuevamente: muestra el código para ver qué pasa.

Cita:
Iniciado por Randill Ver Mensaje
La solucion de eso seria, especificarle a la funcion fopen, k en vez de comenzar a transmitir la linea 1, comience por la linea 6 [...]
Poniendo 'a+' en el modo de apertura de fopen(), ubica el puntero al final del mismo... luego sería moverte con fseek() para leer esas últimas líneas (nunca lo he hecho)... pero quizá esto ya lo haces, no lo sé.

Y bueno, se podría traer todo el fichero y ya no habrá problema de lectura, pero claro, todo un fichero para leer solo unas líneas... podría no ser tan rápido como lo requieres. No habría mejor solución que tener acceso al servidor donde se encuentre el archivo (tan solo para ejecutar un script).
__________________
٩(͡๏̯͡๏)۶
» Cómo hacer preguntas de manera inteligente «

"100 años después, la revolución no es con armas, es intelectual y digital"
  #8 (permalink)  
Antiguo 02/05/2008, 02:43
 
Fecha de Ingreso: marzo-2008
Mensajes: 303
Antigüedad: 16 años, 1 mes
Puntos: 4
Re: leer ultimas lineas de archivo remoto grande

Yo no lo he probado personalmente pero en teoría se puede hacer con éste modulo de PERL:
Net::FTP::RetrHandle

Ya que en la synopsis dice:
"Provides a file reading interface for reading all or parts of files located on a remote FTP server, including emulation of seek and support for downloading only the parts of the file requested."
  #9 (permalink)  
Antiguo 02/05/2008, 09:02
 
Fecha de Ingreso: agosto-2003
Mensajes: 52
Antigüedad: 20 años, 8 meses
Puntos: 0
Re: leer ultimas lineas de archivo remoto grande

Creo k al poner el a+, tendria el mismo problema ke con el fseek, ya que la funcion fopen, esta bajando la primera parte.

este codigo (php.net) hace parcialmente lo k kiero de forma local, pero en remoto lee la primera linea como ultima y hasta ahi llega.
Código PHP:
<?php
readLastLine
("ftp://user:[email protected]/archivo.log");
function 
readLastLine ($file) {
    
$fp = @fopen($file"r");

    
$pos = -1;
    
$t " ";
    while (
$t != "\n") {
        if (!
fseek($fp$posSEEK_END)) { // *** - fseek returns 0 if successfull, and -1 if it has no succes as in seeking a byte outside the file's range
            
$t fgetc($fp);
            
$pos $pos 1;
        } else { 
// ***
            
rewind($fp); // ***
            
break; // ***
        
// ***
    
}
    
$t fgets($fp);
    
fclose($fp);
    return 
$t;
}
?>
Transferir el archivo luego de procesarlo no me sirve, ya que la idea es k sea casi instantaneo y el archivo rondea los 20 mb.

En cuanto a la solucion de a2a2, me dio una idea sobre como podria hacerlo, y es precisamente simulando ke continuo una descarga x ftp, ya que podria transferir solo la ultima parte del archivo lo k seria mas rápido. Ahora busco como se hace eso en php :p. Muchas gracias, luego cuento como salio todo.
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 23:40.