XML文件I / O会导致php中的同步问题吗?

时间:2010-10-15 15:55:22

标签: php xml

现在我面临的情况是我正在构建一个没有mysql或任何其他数据库的网站。 经过考虑,我选择使用Xml文件进行配置和数据存储(实际上我真的没有选择)。

我的问题是,如果不同的用户一次读取和修改相同的xml文件,是否会出现任何同步问题或其他问题? 如果有,是否有解决方案?

对于一个简单的子弹板系统,xml的性能如何(与使用mysql的同一系统相比)? 有关提高性能的任何提示吗?

2 个答案:

答案 0 :(得分:0)

XML文件就像任何其他文件一样,如果两个人同时修改它,它们将会破坏彼此的数据。通常的解决方案是使用可以处理并发访问的数据库,例如,通过将数据分成可独立修改的记录。

如果你真的不能使用数据库(为什么?),解决方法是尝试将数据分成每个用户的单独文件,这样它们就不会发生冲突。但是,如果您的数据适用于多个不起作用的用户。

您可以使用XML数据库,但这仍然是一个数据库。此外,XML数据库通常针对文档存储进行优化,而不是配置和数据存储。

答案 1 :(得分:0)

是的,很可能会出现同步问题。

您是在UNIX / Linux上部署吗?如果是这样,我会做以下事情。每次编写文件时,都在同一目录中使用新的临时文件名创建文件。完成后,将文件重命名为您想要的文件,覆盖已存在的任何文件。

这会产生以下后果:

  • 如果你的程序在编写XML文件的过程中崩溃了,那没关系,磁盘上只有一个额外的垃圾文件
  • 由于文件位于同一目录中,因此它位于同一磁盘上,这意味着重命名操作是原子的;它要么成功(在这种情况下你有新文件)或失败(那么你有旧文件)。在任何一种情况下,您都有一个有效的文件
  • 如果两个进程同时尝试并写入同一个文件,它们将创建不同的临时文件。其中一个将获胜,然后在磁盘上你将拥有其中一个想写的版本。您丢失数据(双重更新问题),但至少您没有损坏的数据。
  • 如果另一个进程正在读取旧文件,当它被覆盖时,由于该文件的inode仍然存在,读取仍将继续针对旧文件。一旦最后一个进程关闭它,操作系统将删除该文件。同样,该过程会看到文件的一致视图。
  • 主要问题是如果两个进程一次写入文件,或者如果存在“加载数据,处理它,写入它”过程将丢失在“处理它”阶段期间发生的任何写入的数据丢失。但是,这与使用数据库的“SELECT,process,UPDATE”没有什么不同,也许是可以接受的。

要摆脱垃圾文件,您可以从find执行crontab命令,查找超过一天的文件并匹配临时文件的名称架构并删除它们。

如果您确实需要锁定文件(即“读取,处理,写入”不应被其他进程中断),那么您可以使用操作系统提供的某些文件锁定API。编写临时“锁定”文件是危险的,就好像你的进程崩溃一样,然后它们将永远存在,然后什么都无法写入文件。