Как посмотреть запись файла в PHP? - PullRequest
16 голосов
/ 09 июля 2009

Я хочу сделать движение, такое как команда tail с PHP, а как часы могут добавить в файл?

Ответы [ 6 ]

24 голосов
/ 09 июля 2009

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

Вот краткий пример, который не включает обработку ошибок:

function follow($file)
{
    $size = 0;
    while (true) {
        clearstatcache();
        $currentSize = filesize($file);
        if ($size == $currentSize) {
            usleep(100);
            continue;
        }

        $fh = fopen($file, "r");
        fseek($fh, $size);

        while ($d = fgets($fh)) {
            echo $d;
        }

        fclose($fh);
        $size = $currentSize;
    }
}

follow("file.txt");
11 голосов
/ 05 января 2013
$handle = popen("tail -f /var/log/your_file.log 2>&1", 'r');
while(!feof($handle)) {
    $buffer = fgets($handle);
    echo "$buffer\n";
    flush();
}
pclose($handle);
5 голосов
/ 11 декабря 2012

Оформить заказ php-tail в коде Google . Это двухфайловая реализация с PHP и Javascript, и в моем тестировании она требует очень мало времени.

Он даже поддерживает фильтрацию по ключевому слову grep (полезно для ffmpeg, который выдает частоту кадров и т. Д. Каждую секунду).

2 голосов
/ 09 июля 2009

Вместо опроса размера файла вы регулярно проверяете время изменения файла: filemtime

2 голосов
/ 09 июля 2009
$handler = fopen('somefile.txt', 'r');

// move you at the end of file
fseek($handler, filesize( ));
// move you at the begining of file
fseek($handler, 0);

И, вероятно, вы захотите рассмотреть использование stream_get_line

0 голосов
/ 15 апреля 2016

Ниже приведено то, что я адаптировал сверху. Периодически вызывайте его с помощью вызова ajax и присоединяйте к своему «держателю» (textarea) ... Надеюсь, это поможет ... спасибо всем, кто участвует в stackoverflow и других подобных форумах!

/* Used by the programming module to output debug.txt */
session_start();
$_SESSION['tailSize'] = filesize("./debugLog.txt");
if($_SESSION['tailPrevSize'] == '' || $_SESSION['tailPrevSize'] > $_SESSION['tailSize'])
{
      $_SESSION['tailPrevSize'] = $_SESSION['tailSize'];
}
$tailDiff = $_SESSION['tailSize'] - $_SESSION['tailPrevSize'];
$_SESSION['tailPrevSize'] = $_SESSION['tailSize'];

/* Include your own security checks (valid user, etc) if required here */

if(!$valid_user) {
   echo "Invalid system mode for this page.";
}
$handle = popen("tail -c ".$tailDiff." ./debugLog.txt 2>&1", 'r');
while(!feof($handle)) {
    $buffer = fgets($handle);
    echo "$buffer";
    flush(); 
}
pclose($handle);
...