2011-06-14 67 views
2

我有一个文件用于记录客户端的IP地址。他们想保留文件的最后500行。它在一个带有PHP4的Linux系统上(哦,不!)。如何使用Linux或PHP将文件保持为1000行?

我打算使用新的IP地址一次添加一行文件。我们无法访问cron,因此我可能需要使此函数也可以执行行限制清理。

我想或者使用像exec('tail [some params]')或者可能用PHP读取文件,在换行符中将其分解为数组,获取最后1000个元素并将其写回。似乎有点内存密集虽然。

什么是更好的方法来做到这一点?

更新:

每低于@ meagar的评论,如果我想用压缩功能,我将如何做到这一点我的PHP脚本? (没有进入的cron)

 
if(rand(0,10) == 10){ 
shell_exec("find . logfile.txt [where size > 1mb] -exec zip {} \;") 
} 

将拉链自动枚举的文件,如果有一个现有的文件或做我需要做手工?

+6

处理此问题的更简单和更标准的方法是定期轮换日志文件。只要文件达到一定的大小时压缩文件,并启动一个新的日志文件。您将结束当前的'.log'文件和一系列压缩的'.log.1.gz','.log.2.gz'文件。 – meagar 2011-06-14 15:52:17

+0

我同意迈格尔这似乎是最好的方法,特别是与历史的角度! – freshnode 2011-06-14 15:57:52

+0

@meagar是我可以从PHP做的事情吗?我在该问题中添加了更新的部分。如果你可以发布它作为答案,我会接受它。 – cwd 2011-06-14 16:18:18

回答

2

最快的方式可能是,如你所说,使用尾巴:

passthru("tail -n 500 $filename"); 

(中继不一样的exec只是它输出整个节目输出到标准输出可以使用捕获输出输出缓冲)

[编辑]

我与以前的评论认为,日志旋转将是无限美好......但你没有,你没有进入状态,与cron所以我假设你可以不做logrotate。

0

您可以使用count(explode(“\ n”,file_get_contents(“log.txt”)))来获取行数,如果它等于1000,则获取从第一个\ n开始的子字符串到结束后,添加新的IP地址并再次写入整个文件。 这与以+模式打开文件编写新IP几乎相同。

+0

如果必须在网站上进行每次点击,这种方法非常痛苦。 – 2011-06-14 16:02:23

2

logrotate

这将是“正确”的答案,这并不难无论此设置。

+0

我不确定这是否甚至安装在服务器上,但我会检查出来。你有一个例子语法? – cwd 2011-06-14 16:20:40

+0

该链接在使用logrotate时有相当详细的介绍。 – PHLAK 2011-06-14 16:31:34

+0

对,谢谢。我只是无法访问任何配置文件。 – cwd 2011-06-14 18:19:13

相关问题