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.
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`;
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;
}
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.
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 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
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;
}
...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);
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);
@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.