2008-11-16 49 views
10

我建立在PHP中的小Web应用程序存储在一个纯文本文件的一些信息。然而,这个文本文件是由我的应用程序的所有用户在某个给定的时间点和同时使用/修改的。PHP和并行文件访问

所以问题是。确保只有一个用户可以在任何时间点对文件进行更改的最佳方法是什么?

回答

19

你应该把锁在文件上

<?php 

$fp = fopen("/tmp/lock.txt", "w+"); 

if (flock($fp, LOCK_EX)) { // do an exclusive lock 
    fwrite($fp, "Write something here\n"); 
    flock($fp, LOCK_UN); // release the lock 
} else { 
    echo "Couldn't lock the file !"; 
} 

fclose($fp); 

?> 

看看在http://www.php.net/flock

10

我的建议是使用SQLite。它快速,轻量,存储在一个文件中,并具有防止并发修改的机制。除非你正在处理预先存在的文件格式,否则SQLite是一条可行的路。

2

对于很多用户来说,单个文件实际上不应该成为您使用的策略我不认为 - 否则您可能需要实现一个单一(全局)访问点来监视文件当前是否正在编辑或不。如果你不想要一个完全装修的RDBMS的开销,那么你可以使用数据库(SQLite)

3

你可以做一个提交日志排序格式,如何维基百科做的。

使用数据库,每一个变化保存在数据库中,这使得此前的纪录冗余创建一个新的行,用递增的值,那么你只需要担心在保存阶段获得表锁。

这样,至少在2个并发人发生在编辑什么,都改变将出现在历史上和任何一个失去了对犯有战争可以被复制到新的修订。

现在,如果你不想使用数据库,那么你就不用担心有一个版本控制文件的备份每一个可见的文件。

您可以在文件系统上投入了版本控制(GIT/MERCURIAL/SVN),然后在保存阶段自动提交,

伪代码:

user->save : 
    getWritelock(); 
    write($file); 
    write_commitmessage($commitmessagefile); # <-- author , comment, etc 
    call "hg commit -l $commitmessagefile $file " ; 
    releaseWriteLock(); 
done. 

至少这样,当2人同时做出关键承诺,不会迷失方向。