【发布时间】:2010-03-08 21:02:22
【问题描述】:
我有一个脚本,每次调用它都会获取文件的第一行。已知每一行的长度完全相同(32 个字母数字字符)并以“\r\n”结尾。 获取第一行后,脚本将其删除。
这样做是这样的:
$contents = file_get_contents($file));
$first_line = substr($contents, 0, 32);
file_put_contents($file, substr($contents, 32 + 2)); //+2 because we remove also the \r\n
显然它有效,但我想知道是否有更聪明(或更有效)的方法来做到这一点?
在我的简单解决方案中,我基本上读取和重写整个文件只是为了取出并删除第一行。
【问题讨论】:
-
你可以在内存中提高效率(做一个循环,一次读取一行,一次写出除了第一行),但它看起来很复杂,并且会容易出错。我会做和你一样的。文件从第一个字节开始按顺序存储,这是无法回避的事实。
-
如果您可以将文件存储为索引,并通过索引执行所有 R/W,也许此操作会更快,因为您只需从索引中删除该行,这样做会是比对完整文件执行此操作便宜。但是,如果文件很小,那么 I/O 成本将低于维护索引的开销。
-
对于类似问题,我能想到的唯一高度优化的解决方案将涉及文件系统驱动程序中的 IOCTL,它将从文件而不触及其余部分。但这是解决不存在问题的学术练习,绝对不是你所追求的。 :)
-
###why not 将第 3 行的“32 + 2”替换为“34”。### 如果您反复执行此操作,它可能会帮助几毫秒,或者更多。抱歉,这不能是评论(我没有足够的声誉)。