如何在PHP中创建一个机器可读的日志文件(可能使用fscanf)


How to create an machine-readable logfile in PHP (probably with fscanf)

我想在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. 文本只能包含字母和数字(以及我定义的所有其他特殊字符),但如果我只能排除分隔符
  4. ,这是更好的设计。对于这个任务,fscanf真的是最好的(最快的,最少的内存消耗)函数吗?或者一个带分隔符的简单的fget函数会更好吗?

非常感谢您的帮助;-)

从您的示例数据来看,在我看来,最好的方法是内置的csv函数,fgetcsv和fputcsv。只需使用空格而不是逗号作为分隔符。这些函数会自动记住引号中的值。

可能有一种更简单的方法来做到这一点,但是一个不需要分隔符的稍微长一点的正则表达式解决方案是

$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