Как создать машиночитаемый лог-файл в PHP (возможно, с помощью fscanf) - PullRequest
0 голосов
/ 05 октября 2011

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

Этот файл журнала должен выглядеть следующим образом:

1303942306 26.4 "Lore ipsum 1" 84.169.73.55 appname1 
1303942308 28.8 "Lore ipsum 2" 84.169.73.55 appname2
1304078658 31.2 "Lore ipsum 3" 80.187.103.95 appname3

Как видите, он должен содержать следующие переменные:

$timestamp
$float
$text (with spaces and other special characters)
$ip
$appname

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

Я пытался использовать "|" в качестве разделителя с помощью fscanf, но у него есть несколько "глюков"; -):

//write to file
$statisticsfile = fopen("user.history",'a+b');
     fputs($statisticsfile, time().' | '.$float.' | '.$text.' | '.$_SERVER['REMOTE_ADDR'].' | '.$appname."\r\n");

//read from file
    while ($userinfo = fscanf($statisticsfile, "%[0-9] | %[0-9.-] | %[a-zA-Z0-9 ,] | %[0-9.] | %[0-9]")) 
{list ($timestamp[], $float[], $text[], $ip[], $appname[]) = $userinfo;}

Этот код создает три проблемы:

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

Буду очень признателен за вашу помощь; -)

Ответы [ 2 ]

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

Вероятно, есть гораздо более простой способ сделать это, но одно немного длинное решение регулярных выражений, не требующее разделителя, может быть

$reg = /^(\d{10})\s(\d+[\.]\d*)\s"(.*?)"\s\b((?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))\b\s(\w+)$/;

, когда группа захвата ip выглядит хуже, чем она есть.

, который вы могли бы затем использовать для создания и разбиения строк текста, например ... http://ideone.com/hCvPy

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

Из ваших примеров данных мне кажется, что лучший путь - встроенные функции csv, fgetcsv и fputcsv .Просто используйте пробел в качестве разделителя вместо запятой.Эти функции будут автоматически учитывать указанные значения.

...