Перезагрузите содержимое из файла журнала на странице, используя AJAX - PullRequest
3 голосов
/ 28 октября 2010

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

<?php   
    $logfile = "hello";  
?>
function displayOutput()
{
    var html = <?php
        echo filesize($logfile)
            ? json_encode(file_get_contents($logfile))
            : '"Log file is getting generated"'; 
        ?>;
    document.form.text1.value = html;
}

Однако файл журнала продолжает обновляться, пока сценарий не завершится. Как я могу перезагрузить обновленное содержимое из файла на той же странице?

Ответы [ 4 ]

1 голос
/ 21 октября 2011

Техника, которую я разработал + обсудить здесь, может быть полезной:

http://commavee.com/2007/04/13/ajax-logfile-tailer-viewer/

Это уже давно + работает хорошо.

0 голосов
/ 28 октября 2010

Может быть, вы хотите, чтобы базовое использование XMLHttpRequest.

Я на самом деле не php парень, просто гуру javascript, просто пытаюсь дать вам идею

function refreshText()
{
    if (window.XMLHttpRequest)
    {
        xhttp = new XMLHttpRequest();
    }
    else // for IE 5/6, just in case
    {
        xhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
    xhttp.open("GET","/page.php?action=download_log_file", false);
    xhttp.send();

    document.form.text1.value = xhttp.responseXML;
}
setInterval(refreshText, (10 * 1000)); // refresh text1.value every 10 seconds

то же самое, используя jQuery

setInterval(function {
        $.get('/page.php?action=download_log_file', function(data) {
            $('#text1').val(data);
        });
}, (10 * 1000));

Сценарий обработчика на сервере просто печатает данные файла, см. http://www.w3schools.com/xml/xml_server.asp например

0 голосов
/ 07 января 2011

Недавно я реализовал "COMET-подобную" функциональность, чтобы сделать это. Для этого нужно провести опрос AJAX с длительным тайм-аутом:

var lines = 0 

function getLog(file, lines) {

    $.ajax({
              type:     'POST',
              url:      'http://thissite.com/getLogFile.php?File=' + file + '&Lines=' + lines,
              dataType: 'json',
              timeout:  400000,
        error:
            function() {
                return false;
            },
        success:
            function(data) {
                if (data.Error) {
                    alert(data.Message)
                } else {
                    if (data.Lines > lines) {
                        // do something with data.LogLines, e.g. add to a textarea
                    }
                    getLogFile(file, data.Lines)
                }
            }
    })
}

Скрипт-сервер затем просто зацикливается так:

  1. Подсчет количества строк в файле журнала
  2. Если это так же, как строки, спать (скажем, на секунду), а затем вернуться к 1
  3. Если количество строк больше, вернуть новые строки и количество новых строк и выйти
  4. После некоторого количества итераций (я использую 100) выйдите и верните существующий счетчик строк

Структура данных, возвращаемая внутренним сценарием, представляет собой JSON:

{
    Error: // 0 or 1,
    Lines: // Number of lines
    Text: // New lines from log file
}

Это работает так же, как 'tail -f' в UNIX, но в браузере!

0 голосов
/ 28 октября 2010

Вам необходимо установить интервальный таймер для вызова вашей функции каждые n секунд.Посмотрите на этот ответ, чтобы помочь вам - как планировать вызовы ajax каждые N секунд? .

setInterval(displayOutput, (10 * 1000));
// reload log contents every 10 seconds
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...