2011-05-24 36 views
0

我有一个网站,人们提交内容,然后插入到一个集体的形象。我的代码有效,但到目前为止我发现了一个问题:图像文件写入:安全的方式来锁定文件

如果2个人试图同时写入(同时提交),这会导致输出文件变为0KB,它只是一个空文件。

我使用的是输出缓冲区写,GD2和file_put_contents像这样:

ob_start(); 
imagejpeg($map); 
file_put_contents(MAP, ob_get_contents(), FILE_BINARY); 
ob_end_clean(); 

什么我不知道是什么东西着手解决这一问题的最佳方法是什么?

谢谢!

回答

2

file_put_contents(MAP, ob_get_contents(), LOCK_EX)

+0

我考虑过这个。但是这不会使这个文件对于两个人中的一个不可写入,并且返回关于文件不可写入的丑陋错误吗? – fiiv 2011-05-24 22:16:36

+0

尝试获取锁的第二个脚本应等到锁释放。 – rid 2011-05-24 22:17:39

+0

@MT会,但即使他们的行动将由一些智能互斥体(我有一个:)),第二个用户将覆盖第一个用户的所有数据。 – 2011-05-24 22:18:41

1

PHP中的文件锁定机制,我尝试了一段时间后似乎并没有可靠地防止我的系统上的冲突。即使对于一个简单的网站计数器,我最终还是会在其他一些尝试后使用具有实际文件名中计数器值的空文件,因为文件重命名至少是原子操作。

这些问题可能取决于操作系统和文件系统,现在甚至可能会被修复,但如果您仍然有这样的问题,您可以尝试实施自己的锁定方式,方法是在修改文件之前将文件重命名为其他内容,然后在完成后将其重命名。

或者,您可以考虑将图像存储在数据库中。