PHP-retourner la dernière ligne d'un fichier?

je suppose que c'est fgets, mais je ne trouve pas la syntaxe spécifique. J'essaie de lire (dans une chaîne que je pense plus facile) la dernière ligne ajoutée à un fichier journal.

14
demandé sur waxical 2009-06-30 13:34:19

9 réponses

la solution naïve la plus simple est tout simplement:

$file = "/path/to/file";
$data = file($file);
$line = $data[count($data)-1];

cependant, cela chargera tout le fichier dans la mémoire. Peut-être un problème (ou pas). Une meilleure solution est celle-ci:

$file = escapeshellarg($file); // for the security concious (should be everyone!)
$line = `tail -n 1 $file`;
37
répondu Matthew Scharley 2009-06-30 09:54:42

on dirait que c'est ce que vous cherchez:

tekkie.flashbit.net: Queue de fonctionnalités en PHP

il implémente une fonction qui utilise fseek() avec un index négatif pour enrouler le fichier à partir de la fin. Vous pouvez définir combien de lignes vous voulez retourner.

le code est également disponible comme un Gist sur GitHub :

// full path to text file
define("TEXT_FILE", "/home/www/default-error.log");
// number of lines to read from the end of file
define("LINES_COUNT", 10);


function read_file($file, $lines) {
    //global $fsize;
    $handle = fopen($file, "r");
    $linecounter = $lines;
    $pos = -2;
    $beginning = false;
    $text = array();
    while ($linecounter > 0) {
        $t = " ";
        while ($t != "\n") {
            if(fseek($handle, $pos, SEEK_END) == -1) {
                $beginning = true; 
                break; 
            }
            $t = fgetc($handle);
            $pos --;
        }
        $linecounter --;
        if ($beginning) {
            rewind($handle);
        }
        $text[$lines-$linecounter-1] = fgets($handle);
        if ($beginning) break;
    }
    fclose ($handle);
    return array_reverse($text);
}

$fsize = round(filesize(TEXT_FILE)/1024/1024,2);

echo "<strong>".TEXT_FILE."</strong>\n\n";
echo "File size is {$fsize} megabytes\n\n";
echo "Last ".LINES_COUNT." lines of the file:\n\n";

$lines = read_file(TEXT_FILE, LINES_COUNT);
foreach ($lines as $line) {
    echo $line;
}
13
répondu Tomalak 2013-08-20 17:31:25
define('YOUR_EOL', "\n");
$fp = fopen('yourfile.txt', 'r');

$pos = -1; $line = ''; $c = '';
do {
    $line = $c . $line;
    fseek($fp, $pos--, SEEK_END);
    $c = fgetc($fp);
} while ($c != YOUR_EOL);

echo $line;

fclose($fp);

c'est mieux, puisqu'il ne charge pas le fichier complet dans la mémoire...

définit YOUR_EOL à vos fins de ligne correctes, si vous utilisez les mêmes fins de ligne que les fins de ligne par défaut du système D'exploitation où réside votre script, vous pouvez utiliser la constante PHP_EOL.

7
répondu Jeroen Serpieters 2009-06-30 10:14:58
function seekLastLine($f) {
    $pos = -2;
    do {
        fseek($f, $pos--, SEEK_END);
        $ch = fgetc($f);
    } while ($ch != "\n");
}

-2 parce que le dernier caractère peut être \n

4
répondu constantined 2012-10-26 08:05:09

Vous avez qu'à lire le fichier ligne par ligne et enregistrer la dernière ligne de lecture pour l'obtenir.

ou si vous utilisez unix / linux, vous pouvez utiliser la commande tail

tail -n 1 filename
2
répondu jitter 2009-06-30 09:38:34

celui-ci ne casse pas pour un fichier de 1 ou 0 ligne.

function readlastline($fileName)
{

       $fp = @fopen($fileName, "r");
       $begining = fseek($fp, 0);      
       $pos = -1;
       $t = " ";
       while ($t != "\n") {
             fseek($fp, $pos, SEEK_END);
             if(ftell($fp) == $begining){
              break;
             }
             $t = fgetc($fp);
             $pos = $pos - 1;
       }
       $t = fgets($fp);
       fclose($fp);
       return $t;
}
1
répondu unique_stephen 2009-10-29 04:57:47

...Pourquoi Lire la dernière ligne?

function readLines($fp, $num) {

    $line_count = 0; $line = ''; $pos = -1; $lines = array(); $c = '';

    while($line_count < $num) {
        $line = $c . $line; 
        fseek($fp, $pos--, SEEK_END);
        $c = fgetc($fp);
        if($c == "\n") { $line_count++; $lines[] = $line; $line = ''; $c = ''; }
    }   
    return $lines;
}

$filename = "content.txt";
$fp = @fopen($filename, "r");

print_r(readLines($fp, 2));

fclose($fp);
1
répondu Simon Harper 2012-01-30 10:43:06

Si vous voulez lire un fichier ligne par ligne file fonction lit le contenu d'un fichier ligne par ligne et retours chaque ligne comme un élément d'un tableau.

pour que vous puissiez faire quelque chose de simple comme:

$lines    = file('log.txt');
$lastLine = array_pop($lines);
0
répondu Kieran Hall 2011-11-13 16:46:52

@unique_stephen, votre réponse est erronée. PHP fseek retourne 0 pour le succès et -1 pour l'échec. Stocker le résultat dans $beginining (sic) et ensuite l'utiliser dans un filtre pour ftell () n'est pas correct. Si ma réputation avait été meilleure, je vous aurais rejeté et laissé un commentaire. Voici une version modifiée de la fonction unique_stephen.

function readlastline($fileName)
{
    $fp = @fopen($fileName, "r");
    if (fseek($fp, 0) == -1)
        exit('Cannot seek to beginning of the file'); 
    $pos = -1;
    $t = " ";
    while ($t != "\n") {
        if (fseek($fp, $pos, SEEK_END) == -1)
            exit('Cannot seek to the end of the file');
        if (ftell($fp) == 0) {
            break;
        }
        $t = fgetc($fp);
        $pos = $pos - 1;
    }
    $t = fgets($fp);
    fclose($fp);
    return $t;
}

NOTE: la fseek de PHP ne peut pas chercher à la fin des fichiers plus grands que PHP_MAX_INT qui est signé 32bit même sur 64 bits binaires.

0
répondu Earnie 2018-02-27 15:48:50