fopen并写入文件

时间:2014-05-11 17:32:20

标签: php fopen flock

我对fopen有一些疑问

当我去添加新条目时,第一个问题总是放在文件末尾而没有启动文件,例如:

$fp=fopen("text.dat","a");
fputs($fp,"Hello 1"."\n");
fclose($fp);

此文件中的结果始终显示在最后:

Hello 1
Hello 2
Hello 3

并且没有我想要的,将新评论插入第一个地方以显示为:

Hello 3 
Hello 2
Hello 1 ( The most old entry )

另一方面我的第二个问题,例如,如果我有10个用户并且这10个用户同时在此文本文件中插入一个条目或帖子,那么可能或者可以给我一些错误?或者我需要使用flock直到保存每个帖子,这是当一些用户想要同时在文件中更改内容时没有给我带来问题的最佳方法?

3 个答案:

答案 0 :(得分:1)

无法自动添加文件。因此,最好将现有内容存储在临时文件中,然后将其插入文件中。

$fp=fopen("text.dat","w");
fwrite($fp,"Hello 1"."\n".fread($fp));
fclose($fp);

这将输出为:

Hello 3 
Hello 2
Hello 1

但就锁定而言,我认为这是不可能的,或者不适合回答这个问题。

答案 1 :(得分:0)

  1. 当你写一个文件时,它总是会追加到最后。我没有意识到它的解决方法,但为了达到你想要的效果(即以相反的顺序显示线条),你可以将线条读成一个数组并以相反的顺序显示数组。
  2. 至于锁定,只有一个进程可以锁定文件,所以如果两个用户同时尝试更新同一个文件,你就不必做任何事情 - 只有其中一个会成功 - 这实际上会产生一个不同的问题(其中一个用户将丢失她的帖子)。为了解决这个问题,您应该在保存用户的编辑之前向后端发送帖子的原始副本和用户提交的新版本 - 检查原始版本是否已更新。如果它不是最新的,则意味着另一个用户同时更改了它。 "用户友好"行为将是向用户返回一个错误,说他的版本不是最新的,但也包括他的编辑 - 所以他不必从头开始重写所有内容。

答案 2 :(得分:0)

为此你需要一个数据库,它更适合多用户事物和排序,

或者使用子目录并在其自己的文件中创建每个消息,文件名由可排序的时间戳组成:yyyymmddhhmmss。但是,您需要阻止目录缓存。

由于每个人都有权顽固/削减优势:请file_get_contents加载所有内容,然后file_put_contents