Я хочу считать файл журнала, который постоянно пишется в. Это находится на том же сервере как приложение. Выгода является файлом, записан в каждые несколько секунд, и я в основном хочу tail
файл на приложении в режиме реального времени.
Действительно ли это возможно?
Вам нужно выполнить цикл со сном:
$file='/home/user/youfile.txt';
$lastpos = 0;
while (true) {
usleep(300000); //0.3 s
clearstatcache(false, $file);
$len = filesize($file);
if ($len < $lastpos) {
//file deleted or reset
$lastpos = $len;
}
elseif ($len > $lastpos) {
$f = fopen($file, "rb");
if ($f === false)
die();
fseek($f, $lastpos);
while (!feof($f)) {
$buffer = fread($f, 4096);
echo $buffer;
flush();
}
$lastpos = ftell($f);
fclose($f);
}
}
(проверено .. работает)
Например :
$log_file = '/tmp/test/log_file.log';
$f = fopen($log_file, 'a+');
$fr = fopen($log_file, 'r' );
for ( $i = 1; $i < 10; $i++ )
{
fprintf($f, "Line: %u\n", $i);
sleep(2);
echo fread($fr, 1024) . "\n";
}
fclose($fr);
fclose($f);
//Or if you want use tail
$f = fopen($log_file, 'a+');
for ( $i = 1; $i < 10; $i++ )
{
fprintf($f, "Line: %u\n", $i);
sleep(2);
$result = array();
exec( 'tail -n 1 ' . $log_file, $result );
echo "\n".$result[0];
}
fclose($f);
Просто идея...
Думали ли вы об использовании команды *nix tail? Выполните команду из php (с параметром, который вернет определенное количество строк) и обработайте результаты в вашем php-скрипте.
вы можете закрыть дескриптор файла, когда он не используется (после того, как часть данных была записана). или вы можете использовать буфер для хранения данных и помещать их в файл только тогда, когда он заполнен. таким образом вы не будете постоянно открывать файл.
если вы хотите получить все, что записано в файл, как только оно будет записано в него, вам может потребоваться расширить код, записав данные, чтобы они выводились и в другие места (экран, некоторая переменная, другой файл ...)