PDA

View Full Version : [PHP] leggere le ultime righe di un file molto grosso..


Rubberick
11-01-2008, 21:38
Ipotizziamo di avere un file molto grosso ad es un bel log chiatto di 50mb...

Con php voglio leggere le ultime righe di questo file... mettiamo le ultime 20... oppure senza manco andare a parlare di righe... tot bytes..

Ho visto in giro soluzioni fatte in casa ma tutte prevedono l'uso di file_get_contents, fread o file che non mi sembrano x nulla utili con file di grandi dimensioni xche' prevedono il caricamento di TUTTO il file...

non c'e' una funzione come fread ma con un offset? tipo

fread2($fp,$offset,$lenght) ??

EDIT: ho controllato sul manuale... file_get_contents() ha un parametro di offset ma questo funziona solo su php5 =D

kk3z
11-01-2008, 22:34
fseek (http://www.php.net/manual/en/function.fseek.php), quindi fread

Rubberick
16-01-2008, 14:59
potresti farmi un esempio? =|

kk3z
16-01-2008, 16:54
Chiaramente non puoi trovare le ultime righe con fseek, funziona in bytes, devi fare un po' di calcoli.

$file = fopen(...);

//10 bytes prima della fine del file
fseek($file, -10, SEEK_END);

//Legge questi ultimi 10 bytes
$testo = fread($file, 10);

fclose($file);

Qui c'è una funzione che legge le ultime righe di un file, presa dai commenti di fseek:
function readlog($file, $linefromlast){
$fp = @fopen($file, "r");
$pos = -2;
$t = " ";
$linecounter = 1;
while ($t != "\n" and $linecounter<=$linefromlast) {
fseek($fp, $pos, SEEK_END);
$t = fgetc($fp);
$pos = $pos - 1;
if ($t == "\n" and $linecounter < $linefromlast) {
fseek($fp, $pos, SEEK_END);
$t = fgetc($fp);
$pos = $pos - 1;
$linecounter = $linecounter +1;
}
}
$t = fgets($fp);
fclose($fp);
return $t;
}

Rubberick
16-01-2008, 17:11
grazie 100000