2010-01-14 76 views
7

使用:如果两个用户试图打开相同的文件在同一时间同步文件访问

fopen 
fwrite 
fclose 

会发生什么?

+4

我不确定确切的答案。但是,有人试过这个。 – 2010-01-14 22:43:42

+0

也取决于操作系统。 – 2010-01-14 22:55:02

+1

这几乎是MySQL 3.x在web开发初期变得如此流行的全部原因。 – 2010-01-14 23:31:32

回答

6

小规模的文件操作非常快,以致在同一时间两次写入操作相当罕见。无论如何,你可以使用flock锁定文件:

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

注意fclose自动解锁文件,但我发现它使代码多一点人性化的把这些东西

+0

+1,简洁......不像我的华夫饼! – 2010-01-14 23:01:28

+0

如果解释器锁定文件,但在解锁之前服务器会死机,所以它不会被解锁? – ajsie 2010-01-14 23:02:00

+0

@noname - Yup。锁定系统通常必须进行仲裁,达成共识并处理这些事情。 – 2010-01-14 23:05:07

1

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

3

最重要的是:当他们写

    1. 会发生什么,如果(一)读会发生什么事,(B),然后读取(B),然后写道:(a)书写? (a)的写入无效,因为它的计算不再来自最新状态?

    典型的例子是在许多文本使用的Cash machine/bank balance例子。

    任何种共享可写状态需要某种形式的并发访问控制诸如mutex的,但也有吨潜在问题,例如race conditions,饥饿和对dining philosophers problem变化。

    然而,许多操作系统允许File locking的一些说明,这意味着另一个进程等待锁释放。请参阅PHP's flock() for locking a file.

    您也可以使用“检出,更改,提交/合并”方法。

    根据你的原因,你可能要考虑一个数据库,如MySQLSQLite因为这些将提供更快,更稳健的方式来分享其读取重或不带cache的状态。

    分享状态的诸多问题,陷阱和方式非常多。所有维基百科用法的道歉。

  • 1

    所有时间都会发生。但是,您的问题的答案取决于准确/想要对打开的文件做什么。可能的行动/解决方案纯粹取决于这一要求。

    3

    。使用file_put_contents()而不是FILE_APPENDLOCK_EX标志。

    任何这些标志锁定文件以进行写入。