Question

Je devine que c'est fgets, mais je ne peux pas trouver la syntaxe spécifique. Je suis en train de lire (dans une chaîne je pense est plus facile) la dernière ligne ajoutée à un fichier journal.

Était-ce utile?

La solution

La solution la plus simple est naïve simplement:

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

Bien, cela charger le fichier en mémoire. Peut-être un problème (ou non). Une meilleure solution est la suivante:

$file = escapeshellarg($file); // for the security concious (should be everyone!)
$line = `tail -n 1 $file`;

Autres conseils

Cela ressemble à c'est ce que vous cherchez:

tekkie.flashbit.net: fonctionnalité Queue en PHP

Il met en oeuvre une fonction qui utilise fseek () avec un indice négatif pour enrouler le fichier à partir de la fin. Vous pouvez définir le nombre de lignes que vous voulez renvoyer.

Le code est également disponible comme 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;
}
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);

Cela vaut mieux, car il ne charge pas le fichier complet dans la mémoire ...

Set YOUR_EOL à vos fins de ligne correcte, 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 PHP_EOL constante.

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

Vous devez soit lire le fichier en ligne par ligne et enregistrer la dernière ligne de lecture pour l'obtenir.

Ou si sur unix / linux vous pouvez envisager d'utiliser la queue de commande shell

tail -n 1 filename

Celui-ci ne cassera pas pour un fichier ou une ligne 0.

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;
}

... Pourquoi lire juste 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);

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

Alors vous pourriez faire quelque chose de simple comme:

$lines    = file('log.txt');
$lastLine = array_pop($lines);

@unique_stephen, votre réponse est erronée. PHP fseek renvoie 0 pour le succès et -1 pour l'échec. Stockage du résultat en début de $ (sic), puis plus tard en utilisant dans un filtre pour ftell () est incorrect. Si ma réputation était plus élevé, je vous ai voté vers le bas et a laissé un commentaire. Voici une version modifiée de la fonction de 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 PHP ne peut pas gérer de chercher à la fin des fichiers de plus de PHP_MAX_INT qui est signé 32bit même sur les binaires 64 bits

.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top