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

  • Автор темы Автор темы Ge0SuB
  • Дата начала Дата начала

Ge0SuB

Guest
Вопрос по выводу текстового файла по мере его заполнения.

Есть лог файл,он постоянно наполняеться новыми строками, размер давольно большой, нужно на пхп сделать так, что-бы выводился не весь файл, а только те строки которые поступили с момента запуска ПХПшного скрипта. В мануале я не нашер решение этой проблемы.
Спасибо за советы :)
 
Ge0SuB

запоминать положение указателя и в следующий раз читать начиная с его предыдущего состояния
http://ru.php.net/manual/ru/function.fseek.php
 
tail -f отлично, но как я могу выводить на экран данные которые выводит tail по мере их поступления?
 
python

слушай, ты достал засорять форум - все твои письма начинаются "не понял, что это значит", но лезешь - усохни короче - не понимаешь - молчи в трубочку

-~{}~ 31.08.05 15:18:

Ge0SuB

http://php.rinet.ru/manual/ru/function.exec.php
там найдешь ответ на то, как получить вывод
 
Автор оригинала: kvf77
python

слушай, ты достал засорять форум - все твои письма начинаются "не понял, что это значит", но лезешь - усохни короче - не понимаешь - молчи в трубочку
свои переживания по этому поводу можешь слать мне в приват, хотя МЕНЯ врядли заинтересует ТВОЕ мнение
 
python

тебя заинтересует помещение тебя в readonly?
ты тока скажи

сколько тебе говорить можно? твои глупые идеи и никчемные советы просто достали уже
 
tail -f отлично, но как я могу выводить на экран данные которые выводит tail по мере их поступления?
 
Ge0SuB

я же тебе дал ссылку - смотри как получить инфо отработавшей в консоли проги.
я всеже рекомендовал тебе fseek
 
Автор оригинала: kvf77
python

тебя заинтересует помещение тебя в readonly?
ты тока скажи

сколько тебе говорить можно? твои глупые идеи и никчемные советы просто достали уже
еще раз повторюсь - жду в привате, но раз ты пишешь сюда: "считай что сказал"
 
Привет всем.
Меня интересует такой же вопрос - вывод новых строк файла лога squid в браузер php-скриптом...
Я эти два рекомендуемых решения попробовал, но что-то строки выводятся пачками - не по одной, а сразу на полторы страницы браузера, т.е. не видно реальной динамики.

Вот мой корявый скрипт где я это пробовал и fseek'ом и tail'ом...

Код:
error_reporting(E_ALL);
//ini_set('auto_detect_line_endings','1');

$squid_log="/var/log/squid/access.log";

//$squid_log_handle = popen("/usr/bin/tail -fn1 $squid_log",'r');

$squid_log_handle = fopen($squid_log,'r');

while(true)
{

//ob_start();

$file_size = filesize($squid_log); //echo $file_size.'===<br>';
usleep(100);

fseek($squid_log_handle,$file_size).'=';

//if(!feof($squid_log_handle))
{
    if ($s = fgets($squid_log_handle))
    {
    print $s."<br>\n";

    //echo "<table width=750><tr><td width=100> $a[7] </td><td> $a[6] </td><tr></table>");
    print("<script> window.scrollBy(0,100000)</script>");
    }
}

//    ob_flush();

clearstatcache();
}

fclose($squid_log_handle);
//phpinfo();

при этом убрал в php.ini буферизацию вывода

а есть perl'овский скрипт где это все отлично работает, строки выводятся не пачками, а по одной, красивенько по мере появления в access.log

Код:
#!/usr/bin/perl
$|=1;

@ENV{PATH}="";
my $file="/var/log/squid/access.log";
my $temp_file="/tmp/temp.log";
my $temp_file1="/tmp/temp1.log";
my $count=0;
my @temp;
print("Charset: koi8-r\n");
print("Content-Type: text/html\n\n");
print("<html>\n");
print("<head>\n");
print("<title>Statistics server </title>\n");
print("</head>\n");
print("<body bgcolor=white text=blue>\n");
open(LOG,"/usr/bin/tail -fn1 /var/log/squid/access.log|");

while(<LOG>)
{
    @a=split;
                print ("<table width=750><tr><td width=100> $a[7] </td><td> $a[6] </td><tr></table>");
                print ("<script> window.scrollBy(0,100000)</script>");
}
print("</body>\n</html>");

подскажите как сделать в php чтобы строки выводились по одной...
 
2 pnt, не лучший это способ(как я понял у тебя написан демон, который выводит новые строчки по мере их появления), так как когда лог окажется слишком большим браузер будет вообще систему всю загружать. Проверенно.
Лучший способ kvf77 предложил:
1) записал положение указателя в файл. Скрипт погиб.
2) Считал положение указателя, переместил его как надо, дальше до конца файла читаешь файл. СНова записал положение указателя в файл.
И так по кругу.
На html форме будут только новые данные(строки) и кнопка рефреш.

-~{}~ 22.07.08 18:45:

<подскажите как сделать в php чтобы строки выводились по одной...
http://ru2.php.net/manual/ru/function.flush.php

-~{}~ 22.07.08 18:50:

$file_size = filesize($squid_log); //echo $file_size.'===<br>';
usleep(100);

fseek($squid_log_handle,$file_size).'=';

В вашем случае fseek не нужен, так как fgets итак дойдёт до конца файла, дальше пауза, после которой идёт проверка и цикл, в котором проверяется конец ли файла. и слипа время я бы больше сделал.
 
AJAX, которорый с определенной периодичностью отправляет на сервер последний известные ему seek, а получает в ответ новый блок плюс seek на конец этого блока. уже на клиенте новый блок выводиться по вкусу - хоть в прямом, хоть в обратном порядке.

запоминать seek на сервере это маразм (разве что в сессии), представьте если лог будут смотреть более одного клиента.
 
Baranov_Dron чего ж демон, это просто линуксовская команда tail. Размер лога тут некритичен.
Кнопка рефреш категорически не подходит.
А вот за flush спасибо - я ob_flush нашел, а до flush'а не дошел :(, теперь строки в браузере выводятся также как их выдает tail в linux.
Если без tail, то seek нужен, потому что мне надо выводить последние строки, а не пробегать fgets'ом весь файл.
Тот скрипт что я запостил до этого с flush заработал нормально.

В итоге останавливаюсь на:
Код:
$squid_log="/var/log/squid/access.log";
$squid_log_handle = popen("/usr/bin/tail -fn1 $squid_log",'r');

while(!feof($squid_log_handle))
{
    $s = fgets($squid_log_handle);
    echo $s."<br>\n<script> window.scrollBy(0,100000)</script>";
    flush();
}

pclose($squid_log_handle);
 
Сверху