2010-09-30 176 views
1

我正在研究一个可以自动调整图像大小的PHP web应用程序,我正在考虑将已缓存的副本存储在已安装NFS的NAS上,以便在更新图像时轻松刷新缓存。如果2台或更多服务器试图同时写入同一文件,NFS会发生什么情况?

我唯一担心的是如果群集中的2台或更多台服务器试图同时创建相同的图像缓存文件,通常会发生什么情况?

当缓存刷新内容更新时可能会发生碰撞,但我没有很好的方法在开发中测试这种情况,因为我只在一个盒子上工作。

任何有此经验的人?

+1

在http://serverfault.com/上提问可能会更好。 – tplaner 2010-09-30 16:44:48

+0

我没有跑到serverfault.com,所以感谢你指出。这看起来像是一个很棒的资源,我将来也会用到它,但我认为steven_desu会照顾到我。 – user126715 2010-09-30 17:25:37

回答

3

这取决于你如何打开文件。如果以“append”模式打开文件,那么Unix/Linux实际上会将内容写入缓存,直到您创建一个换行符,然后将新行粘到文件末尾(覆盖“文件结尾“字节模式)并写入新的”文件结束“。在这种情况下,如果两个人试图同时写入同一个文件,那么两个写入行都会通过,并按照接收到的顺序一次一行地附上自己的行。因此,你能指望这样的:

This was the old contents 
of the file 
The first script added 
The second script added 
this line (script 1) 
this line (script 2) 

在难得的机会,这两个“写”命令,在完全相同的时间(下降到纳秒的精度)到达那么操作系统实际上创建中断状态。这取决于操作系统如何处理这个问题,但大多数只会产生两个随机数来决定谁先走。

如果以“写入”模式打开文件(假设您想将内容添加到中间),那么您实际上必须锁定文件才能执行此操作。第二个PHP脚本会抛出一个错误,说它无法打开文件。

+0

感谢您的信息。该图像与PHP的imagejpeg()函数一起保存,该函数声明它将创建或覆盖给定的文件,这似乎与使用'w'的fopen()相同,在该文件中截断文件如果存在则写入,或者如果存在则创建它它不见了。 – user126715 2010-09-30 17:13:59

+0

所以我认为最糟糕的情况是服务器1尝试使它......它完成了,但服务器2已经开始在服务器1完成之前制作它自己的版本(因此2没有看到完成的文件),所以当它完成后,它将替换刚刚用相同副本创建的服务器1。 这似乎会工作得很好,真的是一种情况,可能不会经常发生。如果我想进一步减少冲突,我甚至可以在实际保存图像之前添加文件检查。再次感谢您的帮助! – user126715 2010-09-30 17:23:04

相关问题