php关于文件操作-读取一行处理一行之后把该行删除

1.现在有一个300M的文件 需要把里面的数据一行一行读取出来,每行进行处理(无法做成幂等)。但是怕处理过程中系统挂掉,不知道该从哪一行再重新读取,怕挂之前已经处理的行再次处理一遍
2.现在想到的方案是 读取一行处理一行之后把该行删除,即时程序挂掉,再次执行从开始读也不会读取到原来已经处理的行
3.看一下各位大牛有没有好的解决方案谢谢

//想读取一行删除一行 该如何操作或者有更好的解决方案 避免同一行执行两次

$fp = fopen($fileName, "r");
if (!$fp) {
    return -1;
}
$max = 40960; //40k

while (!feof($fp)) {
    $line = fgets($fp, $max);
    }

现在的处理方案是把处理到多少行了进行文件存储,避免崩盘之后从头开始再执行,本来打算存redis的,但是就在一台机器上执行,存文件吧

阅读 5.5k
3 个回答

我觉得你可以换个方式来实现你要的效果:你可以读取一行,处理完这行后,在这行后加个特殊的符号。循环遍历每行就能知道哪些行是被处理过的。假如你的程序挂掉,再次执行的时候,直接搜索那个特殊符号最后一次出现的地方。然后这个地方的下一行就是你该开始执行的地方了。

既然是规定一行一行读取的,那么何不写一个脚本把文件先拆分成多个小文件(注意命名,比如 Linux 中的 split 命令),然后再写个脚本循环读取操作。

另外写个文件, 记录处理位置. 记行号也行, 整体文件的偏移也行.

边读边改文件, 性能太低吧.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题