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

Я хочу считать файл журнала, который постоянно пишется в. Это находится на том же сервере как приложение. Выгода является файлом, записан в каждые несколько секунд, и я в основном хочу tail файл на приложении в режиме реального времени.

Действительно ли это возможно?

12
задан HyderA 10 July 2010 в 11:00
поделиться

4 ответа

Вам нужно выполнить цикл со сном:

$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);
    }
}

(проверено .. работает)

23
ответ дан 2 December 2019 в 05:53
поделиться

Например :

$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);
1
ответ дан 2 December 2019 в 05:53
поделиться

Просто идея...

Думали ли вы об использовании команды *nix tail? Выполните команду из php (с параметром, который вернет определенное количество строк) и обработайте результаты в вашем php-скрипте.

-1
ответ дан 2 December 2019 в 05:53
поделиться

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

если вы хотите получить все, что записано в файл, как только оно будет записано в него, вам может потребоваться расширить код, записав данные, чтобы они выводились и в другие места (экран, некоторая переменная, другой файл ...)

0
ответ дан 2 December 2019 в 05:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: