我有一个Web应用程序,当用户单击“保存”时,应该写入文件。该应用程序是“足球调度程序”,因此不止一个玩家可以同时点击保存按钮。
最初我认为这将是罕见的,但事实并非如此,因为当宣布的球员冲进比赛时,因为比赛将在很短的时间内完成。
如果两名玩家同时按下保存会怎样?只有一个玩家的保存才会生效而另一个玩家将会丢失(并且在最后一个可用位置发生这种情况并不罕见,然后会发生冲突)。
我该如何应对这种现象?
//删除了代码,因为它不需要
我想知道在不使用数据库的情况下是否可行。所以也没有接受答案。
答案 0 :(得分:2)
我认为你会像数据库一样处理这个问题。为文件添加一个锁并等待。
类似的东西:
while (file_exists('file.lock')) {
usleep(10000);
}
touch('file.lock');
...
unlink('file.lock');
您可能想要添加超时。我认为这样足够安全,但我想两个用户仍然可以在同一时间运行它。在这种情况下,您可能需要在继续之前添加检查其内容已成功保存的内容。
更新:正如Marc B指出的那样,文件锁定似乎包含在php中,直到他指出flock()才知道这个函数。
$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()
是如何工作的。
答案 1 :(得分:0)
无法同时写入同一文件。
您可以使用数据库,该数据库可以同时处理多个访问。在我看来,这是处理和访问大量数据的最佳解决方案!
或者您可以将数据存储在单独用户的单独文件中,这些用户都是在某个文件夹中创建的,如果有更多可用文件,请将它们一个接一个地保存,然后再将其删除。然后继续写入主文件,直到没有更多文件可用。这将是一种解决方法,我真的不推荐它,但无论如何,如果你真的不想使用数据库它应该工作。