我有一个文件用于logging客户端的IP地址。 他们想保留文件的最后500行。 这是在一个PHP4的Linux系统上(不!)。
我打算用新的IP地址一次添加一行文件。 我们没有权限访问cron,所以我可能需要使这个函数进行行限制清理。
我想用exec('tail [some params]')
或者用PHP读取文件,用换行符将其分解为数组,获取最后1000个元素,然后写回。 似乎有点内存密集虽然。
什么是更好的方法来做到这一点?
更新:
Per @ meagar的下面的评论,如果我想使用zipfunction,我将如何做我的PHP脚本? (不能访问cron)
if(rand(0,10)== 10){ shell_exec(“find.logfile.txt [where size> 1mb] -exec zip {} \;”) }
如果有一个现有的文件,将拉链自动枚举文件,或者我需要手动吗?
按照你的建议,最快的方法可能是使用tail:
passthru("tail -n 500 $filename");
(passthru与exec相同,只是它将整个程序输出输出到标准输出,可以使用输出缓冲区捕获输出)
[编辑]
我同意以前的评论,一个日志旋转将是无限更好的…但是你说,你没有访问的Cron,所以我假设你不能做logrotate。
日志轮播
这将是“正确的”答案,要做到这一点也不难。
你可能会得到使用count(explode(“\ n”,file_get_contents(“log.txt”)))的行数,如果它等于1000,从第一个\ n开始的子字符串到结尾,添加新的IP地址并重新写入整个文件。 这与通过以+模式打开文件来编写新的IP几乎相同。