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

Ge0SuB

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

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

kvf77

Red Devil
Ge0SuB

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

Ge0SuB

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

kvf77

Red Devil
python

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

-~{}~ 31.08.05 15:18:

Ge0SuB

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

python

Новичок
Автор оригинала: kvf77
python

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

kvf77

Red Devil
python

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

сколько тебе говорить можно? твои глупые идеи и никчемные советы просто достали уже
 

Ge0SuB

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

kvf77

Red Devil
Ge0SuB

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

python

Новичок
Автор оригинала: kvf77
python

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

сколько тебе говорить можно? твои глупые идеи и никчемные советы просто достали уже
еще раз повторюсь - жду в привате, но раз ты пишешь сюда: "считай что сказал"
 

pnt

Новичок
Привет всем.
Меня интересует такой же вопрос - вывод новых строк файла лога 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 чтобы строки выводились по одной...
 

Baranov_Dron

Новичок
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 итак дойдёт до конца файла, дальше пауза, после которой идёт проверка и цикл, в котором проверяется конец ли файла. и слипа время я бы больше сделал.
 

dimagolov

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

запоминать seek на сервере это маразм (разве что в сессии), представьте если лог будут смотреть более одного клиента.
 

pnt

Новичок
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);
 
Сверху