Как посмотреть файл в PHP?

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

Ответы

Ответ 1

Я не верю, что есть какой-то волшебный способ сделать это. Вам просто нужно постоянно проверять размер файла и выводить любые новые данные. На самом деле это довольно просто, и единственное, что нужно учитывать, это то, что размеры файлов и другие данные статистики кэшируются в 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");

Ответ 2

$handle = popen("tail -f /var/log/your_file.log 2>&1", 'r');
while(!feof($handle)) {
    $buffer = fgets($handle);
    echo "$buffer\n";
    flush();
}
pclose($handle);

Ответ 3

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

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

Ответ 4

$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

Ответ 5

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

Ответ 6

Ниже я приспособился сверху. Назовите его периодически с помощью 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);