PHP - 多个用户同时编辑同一图像

时间:2009-11-28 11:08:54

标签: php image-processing gd

我希望让多个用户使用gd库的imagecopymerge函数编辑同一个图像。

我担心两个用户可能会选择同时编辑图像。然后,应用程序单独合并两个用户图像,最后保存它们,但一个覆盖另一个,因此缺少一个用户图像。

我不确定如何测试上述......是否有可能,如果可以的话我该如何对抗呢?

2 个答案:

答案 0 :(得分:2)

存储用户开始编辑图像时的上次修改时间戳。当他们提交更改时,请再次检查上次修改的时间戳。如果不同,请通知用户,而不是其他用户已修改图像。

在选择覆盖之前,您可能希望让用户看到图像的新版本。此外,您可能希望提供版本控制系统(维基百科)以让人们回滚更改。

编辑(回应以下评论)

  1. 与存储上次修改的时间戳(或者可能除此之外)相反,存储原始图像的哈希值。并在覆盖之前立即进行比较。否则与上述相同。

  2. 如您所建议的另一个选项也可以正常使用。在工作流程的第3步,在流程开始时创建一个[imagefilename] .lock文件(或修改数据库中的字段,如果它们存储在那里),如果尚不存在,当然如果存在,那么与上述相同。

  3. 要扩展上面第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 相对于原始图像。

一种方式:

  1. 用户Fred获取原始源图像I1并对其进行编辑。弗雷德回复了整个新图像N1
  2. 您计算图像D1的增量,即{N1 - O}。您可以从磁盘检索当前映像I2,而不是仅保存覆盖N1,而此时I1可能已经更改(I1不需要等于I2)。您将D1应用于I1并用生成的图像覆盖图像,我们将其称为I3 请注意,您需要记住I1,以便在$ _SESSION中工作。
  3. 现在,其他Ria可以在之前的步骤中编辑相同的图像。例如,在Fred得到I1之后不久,Ria也得到了它。就在Ria完成工作之前,Fred已将他的delta保存在磁盘上,从而产生I3,就像我们看到的那样。所以现在怎么办? 你盲目地应用第2步。我将展示会发生什么:User2提交他的工作N2,通过比较I1和N2计算delta D2(Ria的会话包含I1)。从磁盘中检索当前映像,这可能是您可能正确记住的I3。此delta D2应用于I3,从而生成I4,将其保存到磁盘。结果是Ria已经淹没了I3,但只有她实际编辑过的那些部分。
  4. 此配方将起作用,因为文件保存是php中的原子操作。

    要实现这一目标

    1. 您需要确保当用户A检索要编辑的图像时,我需要存储在A的会话中。容易。
    2. 您需要能够计算图像的差异,并将此差异应用于图像。例如,imagemagick's compare function应该可以实现这一点。看一下这个网址的例子,你会发现差异白像素是那些未触及的像素。