我正在用 PHP 构建一个小型 Web 应用程序,它将一些信息存储在纯文本文件中。但是,我的应用程序的所有用户在某个给定时间点和可能同时使用/修改此文本文件。
所以问题是。确保只有一个用户可以在任何给定时间点对文件进行更改的最佳方法是什么?
我正在用 PHP 构建一个小型 Web 应用程序,它将一些信息存储在纯文本文件中。但是,我的应用程序的所有用户在某个给定时间点和可能同时使用/修改此文本文件。
所以问题是。确保只有一个用户可以在任何给定时间点对文件进行更改的最佳方法是什么?
您应该锁定文件
$fp = fopen("/tmp/lock.txt", "r+");
if (flock($fp, LOCK_EX)) { // acquire an exclusive lock
ftruncate($fp, 0); // truncate file
fwrite($fp, "Write something here\n");
fflush($fp); // flush output before releasing the lock
flock($fp, LOCK_UN); // release the lock
} else {
echo "Couldn't get the lock!";
}
fclose($fp);
我的建议是使用 SQLite。它快速、轻量、存储在文件中,并具有防止并发修改的机制。除非您正在处理预先存在的文件格式,否则 SQLite 是您的最佳选择。
你可以做一个提交日志的格式,就像维基百科那样。
使用数据库,每次保存的更改都会在数据库中创建一个新行,这使得以前的记录变得多余,并具有递增的值,那么您只需要担心在保存阶段获得表锁。
这样至少如果 2 个并发的人碰巧编辑了某些东西,这两个更改都将出现在历史记录中,并且在提交战争中丢失的任何内容都可以复制到新的修订版中。
现在,如果您不想使用数据库,那么您必须担心有一个修订控制文件支持每个可见文件。
您可以在文件系统上放置一个修订控制( GIT/MERCURIAL/SVN ),然后在保存阶段自动提交,
伪代码:
user->save :
getWritelock();
write( $file );
write_commitmessage( $commitmessagefile ); # <-- author , comment, etc
call "hg commit -l $commitmessagefile $file " ;
releaseWriteLock();
done.
至少这样,当 2 个人同时进行关键提交时,谁都不会迷路。
许多用户的单个文件真的不应该是您使用的策略我不认为 - 否则您可能需要实现一个(全局)访问点来监视文件当前是否正在编辑。获取锁,进行修改,释放锁等。我会选择“没有人建议使用数据库”(如果您不想要完整的 RDBMS 的开销,请使用 SQLite)