【问题标题】:fopen and write in filefopen 并写入文件
【发布时间】:2014-06-29 00:48:31
【问题描述】:

我有一些关于 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直到保存每个帖子,当一些用户想要同时更改文件中的某些内容时,这是最好的方法吗?

【问题讨论】:

    标签: php fopen flock


    【解决方案1】:

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

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

    因为每个人都有权固执/切磋:见file_get_contents加载所有内容,file_put_contents

    【讨论】:

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

      【讨论】:

        【解决方案3】:

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

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

        这将输出为:

        Hello 3 
        Hello 2
        Hello 1
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-24
          • 1970-01-01
          • 1970-01-01
          • 2015-01-19
          • 1970-01-01
          相关资源
          最近更新 更多