PHP: как читать файл вживую, который постоянно записывается в

Я хочу прочитать файл журнала, который постоянно записывается. Он находится на том же сервере, что и приложение. Ловушка – это файл, который записывается каждые несколько секунд, и я в основном хочу 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-скрипте.