PHP在文本文件中追加行

PHP在文本文件中追加行,php,Php,我有一个生成错误日志的PHP脚本。现在,我将脚本设置为在每次成功的SQL插入上追加一行 但是在150万张唱片之后,它就有点满了。我想让我的日志有最多行,但我真的不知道如何在不删除文件的情况下读取/删除行 假设我的文件最多可以有20个文件,之后应该删除第一行并附加另一行 有人能给我指引正确的方向吗?或者,如果一个脚本将被张贴,请详细说明 它应该删除第一行并附加另一行 这是一个昂贵的操作,因为它需要读取整个文件,忽略第一行,然后将整个文件写回。如果你只想要20行,那没什么大不了的;如果你想要20K行

我有一个生成错误日志的PHP脚本。现在,我将脚本设置为在每次成功的SQL插入上追加一行

但是在150万张唱片之后,它就有点满了。我想让我的日志有最多行,但我真的不知道如何在不删除文件的情况下读取/删除行

假设我的文件最多可以有20个文件,之后应该删除第一行并附加另一行

有人能给我指引正确的方向吗?或者,如果一个脚本将被张贴,请详细说明

它应该删除第一行并附加另一行

这是一个昂贵的操作,因为它需要读取整个文件,忽略第一行,然后将整个文件写回。如果你只想要20行,那没什么大不了的;如果你想要20K行,并且你的更新频率并不罕见,那将是一件大事


更好的管理方法是轮换整个文件;当一个文件填满时,开始在另一个文件中写入,并且只保留N个最后的文件。如果在Linux上,您可以在
crontab
中使用
logrotate
来解决这个问题。有很多关于如何设置它的好教程(这是一个)。这是很多工具已经采用的方法,例如ApacheWeb服务器。

可能有一些特定于PHP的东西(对此表示怀疑,我找不到)。两个是用PHP手动完成的,它需要读取/写入整个日志文件,这将非常消耗资源(有数百万行)。你可以查看一些操作系统工具,比如@donald123


我的方法是每天使用一个日志文件(或其他合适的时间段)。和清理旧的日志文件。

对于这种选择,我建议您使用依赖操作系统的脚本,例如wc-l log.txt会给您行尾切sed可以是您在php端的朋友您必须阅读整个文件,然后处理它,这可能会减慢您的任务…@donald123:
tail
sed
和任何其他Unix工具都必须做完全相同的事情,读取整个文件并将其写回(虽然它应该做得更快,因为它在本机代码中进行了优化)。@Amadan我知道,但是它仍然更快,因为使用phpIt最多只需要50行,所以(我认为)它不会真正影响我的服务器的性能,我不建议读取整个文件,删除一行,然后写回。创建一个临时文件,在从源文件(要删除的行除外)读取时写入该文件,并且在完成后关闭两个文件,然后删除源文件并将临时文件移动(重命名)为原始名称,或者将原始文件重命名为“备份”,这样会降低内存效率将临时文件命名并重命名为原始文件。@DmitriSologoubenko:实际上,如果没有基准,我不会说我确定,但我可以合理地确定,使用
文件获取内容
分解
内爆
文件写入内容
比逐行读取要快,因为不需要缓冲,所有的迭代都是用C语言而不是PHP语言完成的。首先写入临时文件仍然是一个好主意(作为防止故障的安全预防措施)。但我并不提倡任何特定的阅读/写作方式;逐行和一次完整文件都很昂贵,最好避免。@Amadan,我没有说“它会更快”,我说它会降低内存效率。当您必须处理大文件时,在内存中加载整个文件将消耗至少与文件大小相同的内存。如果您在生产服务器上继续使用这种方法,那么所占用的虚拟内存将与文件大小乘以并发进程数一样多。在任何情况下,我还建议实施某种锁定,以避免两个并发进程同时执行此操作,这可能会导致数据损坏和丢失。@DmitriSologoubenko:您可能已经注意到,在我的回答中,对于大文件,我强烈反对首先删除头行。我还重申,我从未说过你需要立即阅读整个文件;只是你必须把它全部读出来。(“then”可能实际上暗示了这一点,但这不是我想写的。)