我希望让多个用户使用gd库的imagecopymerge函数编辑同一个图像。
我担心两个用户可能会选择同时编辑图像。然后,应用程序单独合并两个用户图像,最后保存它们,但一个覆盖另一个,因此缺少一个用户图像。
我不确定如何测试上述......是否有可能,如果可以的话我该如何对抗呢?
答案 0 :(得分:2)
存储用户开始编辑图像时的上次修改时间戳。当他们提交更改时,请再次检查上次修改的时间戳。如果不同,请通知用户,而不是其他用户已修改图像。
在选择覆盖之前,您可能希望让用户看到图像的新版本。此外,您可能希望提供版本控制系统(维基百科)以让人们回滚更改。
编辑(回应以下评论)
与存储上次修改的时间戳(或者可能除此之外)相反,存储原始图像的哈希值。并在覆盖之前立即进行比较。否则与上述相同。
如您所建议的另一个选项也可以正常使用。在工作流程的第3步,在流程开始时创建一个[imagefilename] .lock文件(或修改数据库中的字段,如果它们存储在那里),如果尚不存在,当然如果存在,那么与上述相同。
要扩展上面第2点中的数据库选项,拥有如下表格会简单得多: image_id | IMAGE_DATA
查询包括开始时的md5(可选择在php中计算md5以减少数据库的负载)
select image_data, md5(image_data) from image_table where image_id=1
然后当你想回写时,做
update image_table set image_data=? where image_id=? and md5(image_data)=?
这使得更新的条件是md5在被覆盖之前是相同的,并且它仍然保留在一个简单的查询中。
然后检查affected_rows。如果没有行受影响,请检查哈希值。如果散列不同,则可能是由于md5检查,查询无法更新。 (注意:您可能还想检查任何mysql错误)
答案 1 :(得分:0)
啊,你基本上想要的是保存 delta 相对于原始图像。
一种方式:
此配方将起作用,因为文件保存是php中的原子操作。
要实现这一目标: