PHP- 파일의 마지막 줄을 반환합니까?
문제
나는 그것이 fgets라고 생각하지만 특정 구문을 찾을 수는 없습니다. 마지막 줄은 로그 파일에 추가 된 마지막 줄을 읽으려고합니다.
해결책
가장 간단한 순진한 솔루션은 간단합니다.
$file = "/path/to/file";
$data = file($file);
$line = $data[count($data)-1];
그러나 이것은 전체 파일을 메모리에로드합니다. 아마도 문제 일 수 있습니다. 더 나은 솔루션은 다음과 같습니다.
$file = escapeshellarg($file); // for the security concious (should be everyone!)
$line = `tail -n 1 $file`;
다른 팁
이것은 당신이 찾고있는 것 같습니다.
Tekkie.flashbit.net : PHP의 꼬리 기능
FSEEK ()를 사용하여 음의 색인을 사용하여 파일을 끝까지 롤업하는 함수를 구현합니다. 반환하려는 줄 수를 정의 할 수 있습니다.
코드도 사용할 수 있습니다 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);
전체 파일을 메모리에로드하지 않기 때문에 이것은 더 좋습니다 ...
스크립트가있는 OS의 기본 선 엔딩과 동일한 라인 엔딩을 사용하는 경우 올바른 라인 엔딩으로 _eol을 설정하면 Constant PHP_EOL을 사용할 수 있습니다.
function seekLastLine($f) {
$pos = -2;
do {
fseek($f, $pos--, SEEK_END);
$ch = fgetc($f);
} while ($ch != "\n");
}
-2
마지막 숯이 될 수 있기 때문입니다 \n
파일을 라인별로 읽고 마지막 읽기 줄을 저장하여 가져와야합니다.
또는 Unix/Linux에서 쉘 명령 꼬리 사용을 고려할 수 있습니다.
tail -n 1 filename
이것은 1 또는 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;
}
... 왜 마지막 줄을 읽습니까?
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);
라인별로 파일을 읽으려면 file
함수는 파일의 내용을 라인별로 읽고 각 줄을 배열의 요소로 반환합니다.
그래서 당신은 다음과 같은 간단한 일을 할 수 있습니다.
$lines = file('log.txt');
$lastLine = array_pop($lines);
@unique_stephen, 당신의 대답은 결함이 있습니다. PHP FSEEK는 성공의 경우 0, -1을 반환합니다. 결과를 $ 시작 (sic)에 저장 한 다음 나중에 ftell () 필터에 사용하는 것이 정확하지 않습니다. 내 명성이 더 높으면 나는 당신에게 투표하고 의견을 남겼을 것입니다. 다음은 고유 _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;
}
참고 : PHP의 FSEEK는 64 비트 바이너리에서도 32 비트에 서명 한 PHP_MAX_INT보다 큰 파일의 끝을 추구 할 수 없습니다.