2009-08-06 3 views
1

Я пытаюсь получить последнюю строку файла. Файл ff.log получает новые данные каждую секунду, пока работает ffmpeg. Файл журнала выглядит следующим образом:Linux безумный файл - странное поведение Получение последней строки файла журнала

кадра = 20 кадров в секунду = 0 Q = 7.7 Размер = 40kB время = 1,24 битрейт = 266.1kbits/с
кадра = 30 кадров в секунду = 28 кв = 6,6 размер = 51KB время = 1,90 биттрат = 218,4 кбит/с
frame = 40 fps = 24 q = 6.6 size = 61kB time = 2,60 bitrate = 191.4kbits/s
frame = 47 fps = 20 q = 6.8 size = 65kB time = 3,08 bitrate = 173.8kbits/с
кадра = 64 кадров в секунду = 22 кв = 7,0 размер = 84KB время = 4.20 битрейт = 163.8kbits/с
(продолжает добавлять новые линии каждую секунду или быстрее)

Я попытался

$line = `tail -n 1 $file`; 

Я попытался с помощью FSEEK() с "php tail script".

Оба результата привели к некоторому странному поведению.

Я побежал мой сценарий из командной строки и выводимый:

кадр = XX кадров в секунду = XX кв = XX размер = XX время = XX битрейта = XXkbits/s

Где XX продолжал расти в течение нескольких секунд, пока это не было значением из последней строки.

Теперь в моем PHP скрипт, я

echo "--$last_line--"; 

Когда я запускаю его, выход в течение нескольких секунд, просто строки лога с увеличением числа. Когда, когда он достигает конца, выход

--ame = 7119 кадров в секунду = 9 д = 13.8 размер = 4809kB время = 474,50 битрейт = 83.0kbits/с

Обратите внимание, что первый " - «столкнулся с $ last_line, а другой -« нет ».

Какое объяснение этому странному поведению?


+0

Пробовал с эхом «-». $ Line. "- \ п"; также –

ответ

3

Это, вероятно, потому, что он думает, что вы просите его напечатать «$ lastline--» ...

Попробуйте

echo '--' . $lastline . '--'; 

вы также можете сделать что-то вроде

var_dump($lastline); die(); 

Чтобы показать вам, что именно находится в переменной, так как это даст вам больше информации.

Однако я предлагаю вам опубликовать весь ваш сценарий, чтобы кто-то мог попробовать и посмотреть, в чем проблема.

EDIT Глядя на файл, кажется, он использует ТОЛЬКО \ r в качестве терминатора линии. Это вызывает проблемы, которые вы видите (это означает «возврат к началу строки») - это означает, что весь журнал отображается как последняя строка.

Попробуйте использовать его команду

cat ff.log | tr "\r" "\n" | tail -n 2 | head -n 1 

, чтобы получить последнюю строку журнала.

+0

Это не сработало. Как вы предположили, я добавил var_dump, но он тоже делает то же самое. См. Снимок экрана, который я добавил. –

+0

Большое спасибо, новая команда работала отлично. Я не думал об этом. Изучение чего-то нового. –

0

И та же проблема имеет и команда tail, и скрипт PHP. Они ищут конец файла, возвращаются к предыдущему концу строки, затем читают и распечатывают все оттуда до конца файла.

Это нормально, если файл не растет очень быстро. Когда файл быстро растет, вы получаете несколько возвращенных строк.

Попробуйте любой из них:

$line = `tail -n 1 $file | tail -n 1`; 
$line = `tail -n 1 $file | head`; 

Первый немного более точным, но второй быстрее.

+0

Спасибо, но это не помогло. Я постараюсь сделать скриншоты. –

Смежные вопросы