什么是自读,然后在PHP覆盖文件内容的最佳方式?

是什么在PHP中最干净的方式打开文件,读取内容,并随后在原有基础上的一些内容覆盖输出文件的内容? 具体来说,我试图打开填充项目的列表(由换行符分隔),进程/项目添加到列表,从列表中删除最旧的N个条目的文件,终于写出列表回文件。

fopen(<path>, 'a+') flock(<handle>, LOCK_EX) fread(<handle>, filesize(<path>)) // process contents and remove old entries fwrite(<handle>, <contents>) flock(<handle>, LOCK_UN) fclose(<handle>)

请注意,我需要锁定与羊群()的文件,以保护它在多个页面请求。 将在“W +'的fopen时标志()ING做的伎俩? PHP手册指出,它会将文件截断到长度为零,因此它似乎可以阻止我读文件的当前内容。

--------------解决方案-------------

如果该文件是不是过大(也就是你可以确信加载它不会吹PHP的内存限制),然后去最简单的方式就是将整个文件读入一个字符串( file_get_contents() ),过程字符串,并将结果写入到文件( file_put_contents() 这种方法有两个问题:

  • 如果文件过大(例如,几万或几百兆),或处理是内存饿了,你打算出内存中运行(更是这样,当你有东西在运行多个实例)。
  • 该操作是破坏性的; 当无法保存,中途,你失去了你所有的原始数据。

如果任何的这些是一个问题,计划B是处理文件,并在同一时间写入到临时文件; 成功完成后,关闭两个文件,​​重命名(或删除)原来的文件,然后将临时文件重命名为原始文件名。

$data = file_get_contents($filename);

file_put_contents($filename, $data);

分类:php 时间:2015-03-15 人气:0
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 1.348 (s). 10 q(s)