同时文件访问

时间:2010-01-14 22:41:50

标签: php

使用:

fopen
fwrite
fclose

如果两个用户同时尝试打开同一个文件会怎样?

5 个答案:

答案 0 :(得分:6)

小规模文件操作非常快,以至于两次写入完全相同。无论如何,您可以使用flock来锁定文件:

$fp = fopen('file.log', 'a+');
flock($fp, LOCK_EX);
fwrite($fp, 'my data');
flock($fp, LOCK_UN);
fclose($fp);

注意fclose会自动解锁文件,但我发现它可以让代码更加用户友好。

答案 1 :(得分:3)

重要的是:

  1. 写作时会发生什么
  2. 如果(a)读取,(b)读取然后(b)写入然后(a)写入会发生什么? (a)的写入无效,因为它的计算不再来自最新的状态吗?
  3. 经典示例是许多文本中使用的 Cash machine/bank balance 示例。

    任何共享可写状态都需要某种形式的并发访问控制,例如mutex,但是存在大量潜在问题,例如 race conditions ,饥饿和 dining philosophers problem 的变体。

    然而,许多操作系统允许 File locking 某些描述,这意味着其他进程等待释放锁定。请参阅 PHP's flock() for locking a file.

    您还可以使用“结帐,更改,提交/合并”方法。

    根据您的原因,您可能需要考虑MySQLSQLite等数据库,因为这些数据库将提供更快,更强大的方式来共享已读取的状态 - 无需缓存或无缓存。

    众多问题,陷阱和分享国家的方式是巨大的。为所有维基百科的使用道歉。

答案 2 :(得分:3)

使用file_put_contents()代替FILE_APPENDLOCK_EX标记。

这些标志中的任何一个都会锁定文件以进行写入。

答案 3 :(得分:1)

是的,您可以同时打开两个文件,除非您锁定文件[flock]。然而,聚集文件的最佳时间是在您写入文件时,或者如果您选择仅允许一个用户在任何一个点查看文件。

答案 4 :(得分:1)

一直发生。但是,您的问题的答案取决于对打开的文件究竟想要/想要做什么。可能的行动/解决方案完全取决于此要求。