我有一个web应用程序,当用户单击“保存”时,应该会发生对文件的写入。应用程序是“足球调度程序”,因此不止一个玩家可以同时点击保存按钮。
一开始我以为这会是一件稀罕的事,但事实并非如此,因为比赛在宣布的球员中蜂拥而至,因为比赛将在短时间内爆满。
如果两个玩家同时按下保存会发生什么?只有一个玩家的扑救生效,而另一个球员会输掉(在最后一个可用位置上发生这种情况并不少见,然后就会有一些冲突)。
我该如何处理这种现象呢?
//删除代码,因为它不需要
我想知道,如果不使用数据库,这是可能的。因此,我们也接受一个否定的答案。
发布于 2015-01-13 19:48:50
我想您应该像处理数据库一样处理这个问题。向文件中添加一个锁并等待。
类似于:
while (file_exists('file.lock')) {
usleep(10000);
}
touch('file.lock');
...
unlink('file.lock');您可能需要添加一个超时。我认为这是足够安全的,但我认为两个用户仍然有可能同时运行这个程序。在这种情况下,您可能需要添加一个检查,以确定它们的内容在继续之前已成功保存。
更新:正如Marc所指出的那样,文件锁定似乎包含在php中,直到他指出羊群()之后才知道这个函数。
$fp = fopen("file", "r+");
// try to acquire an exclusive lock, otherwise sleep 10ms before trying again
while (!flock($fp, LOCK_EX)) {
usleep(10000);
}
fwrite($fp, "Write something here\n");
fflush($fp); // flush output before releasing the lock
flock($fp, LOCK_UN); // release the lock
fclose($fp)这将类似于我上面写的函数。当然,不要注意fwrite,我只是从php.net中复制了这个示例,以说明flock()是如何工作的。
发布于 2015-01-13 19:44:49
不可能同时写入同一个文件。
您可以使用数据库,它可以同时处理多个访问。在我看来,这是处理和访问大量数据的最佳解决方案!
或者您可以将数据存储在独立用户的单独文件中,这些文件都是在某个文件夹中创建的,如果有更多可用的文件,则一个接一个地保存它们,然后删除它们。然后继续在主文件中写入,直到没有更多的文件可用为止。这将是一个解决办法,我真的不推荐它,但无论如何,如果你真的不想使用数据库,它应该能工作。
https://stackoverflow.com/questions/27930164
复制相似问题