2013-04-07 5 views
0

Я имею в лог-файл, как это:получить конкретный текст из текстового файла в PHP

2013-04-08-03-17-52: Cleaning Up all data for restart operation 
2013-04-08-03-18-02: Creating new instance of app before closing 
2013-04-08-03-18-03: New instance created and running 
2013-04-08-03-18-03: Application started 

В настоящее время я загрузки полный файл журнала каждую секунду, чтобы показать его пользователю с помощью JQuery Ajax, так как это будучи soo неэффективным, я пытаюсь выяснить способ загрузки только обновленных строк из файла журнала.

Это их способ получить строки только после определенной отметки времени. 2013-04-08-03-18-03 . Для этого я буду управлять переменной с последней меткой времени и буду обновлять ее каждый раз, когда получаю новые строки.

Я отчасти новичок в Php и знаю только основы чтения и записи файлов.

+0

почему бы не просто загрузить записи хвост? – Baba

+0

@ Баба, пожалуйста, объясните .. я не знаю, как это работает – JAVAGeek

+0

См. Код ниже ... вводят максимальные линии и возможность перемещения указателя файла в начальную позицию последнего повторного запроса с проверкой даты – Baba

ответ

1

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

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

Редактировать: Итак, как это работает?

Предположим, что вы сохранили последнее время модификации в переменной сеанса $_SESSION['log_lastmod'] и последнем смещении в $_SESSION['log_offset'].

session_start(); 

// First, check if the variables exist. If not, create them so that the entire log is read. 
if (!isset($_SESSION['log_lastmod']) && !isset($_SESSION['log_offset'])) { 
    $_SESSION['log_lastmod'] = 0; 
    $_SESSION['log_offset'] = 0; 
} 

if (filemtime('log.txt') > $_SESSION['log_lastmod']) { 
    // read file from offset 
    $newcontent = file_get_contents('log.txt', NULL, NULL, $_SESSION['log_offset']); 
    // set new offset (add newly read characters to last offset) 
    $_SESSION['log_offset'] += strlen($newcontent); 
    // set new lastmod-time 
    $_SESSION['log_lastmod'] = filemtime('log.txt'); 

    // manipulate $newcontent here to what you want it to show 
} else { 
    // put whatever should be returned to the client if there are no updates here 
} 
+0

как я могу установить смещение, в то время как я не знаю о стартовой позиции новых строк – JAVAGeek

+0

Запишите размер ранее доступного файла с помощью функции ['filesize'] (http://php.net/manual/en/function.filesize.php) для получения смещения. После чтения сохраните новый файл. –

+0

Это кажется хорошим, не могли бы вы объяснить каким-то кодом ... Я вроде как новый для php – JAVAGeek

0

попробовать что-то вроде этого:

<?php 
    session_start(); 
    $lines = file(/*Insert logfile path here*/); 
    if(isset($_SESSION["last_date_stamp"])){ 
     $new_lines = array(); 
     foreach($lines as $line){ 
      // If the date stamp is newer than the session variable, add it to $new_lines 
     } 
     $returnLines = array_reverse($newLines); // the reverse is to put the lines in the right order 
    } else { 
     $returnLines = $lines; 
    } 
    $_SESSION['last_date_stamp'] = /* Insert the most recent date stamp here */; 
    // return the $returnLines variable 
?> 

Что это делает читает файл построчно и, если переменная сессии уже существует, добавьте все строки, где штамп с датой новее тот, что в переменной сеанса, к возвращаемой переменной $returnLines, если не существует переменной сеанса, она будет помещать все строки в файл в $returnLines.

После этого он create.updates переменную сеанса для использования при следующем выполнении кода. Наконец, он возвращает данные файла журнала, используя переменную $returnLines.

Надеюсь, это поможет.

+1

Это читает весь файл в памяти каждый раз ... –

+0

Я думал, что проблема была отправкой файла обратно в jQuery, а не только с новыми строками – user1877408

1

Вы можете попробовать

session_start(); 
if (! isset($_SESSION['log'])) { 
    $log = new stdClass(); 
    $log->timestamp = "2013-04-08-03-18-03"; 
    $log->position = 0; 
    $log->max = 2; 
    $_SESSION['log'] = &$log; 
} else { 
    $log = &$_SESSION['log']; 
} 

$format = "Y-m-d-:g:i:s"; 
$filename = "log.txt"; 

// Get last date 
$dateLast = DateTime::createFromFormat($format, $log->timestamp); 

$fp = fopen($filename, "r"); 
fseek($fp, $log->position); // prevent loading all file to memory 

$output = array(); 
$i = 0; 
while ($i < $log->max && ! feof($fp)) { 
    $content = fgets($fp); 

    // Check if date is current 
    if (DateTime::createFromFormat($format, $log->timestamp) < $dateLast) 
     continue; 

    $log->position = ftell($fp); // save current position 
    $log->timestamp = strstr($content, ":", true); // save curren time; 
    $output[] = $content; 
    $i ++; 
} 

fclose($fp); 
echo json_encode($output); // send to ajax 
+0

Я пробовал ваш код .. но, похоже, не возвращает новые строки .. вместо этого он возвращает только две случайные строки .... IDK, но '$ log-> timestamp = strstr ($ content,": ", true);' в этом ..что, если у меня есть несколько ':' в тексте после отметки времени? – JAVAGeek

Смежные вопросы