PHP - birden fazla kullanıcı Simultaniously aynı görüntüyü düzenleyebilirsiniz

2 Cevap php

Ben birden fazla kullanıcı gd kütüphanenin imagecopymerge fonksiyonunu kullanarak aynı görüntüyü düzenlemek için arıyorum.

Ben iki kullanıcı aynı anda görüntüyü düzenlemek için seçebilirsiniz endişe duyuyorum. Sonra birleştirme uygulaması ayrı ayrı iki kullanıcı görüntüleri bulunuyor ve nihayet onları kurtarır ama bir diğer yazar ve böylece kullanıcıların resimlerden biri eksik.

Ben yukarıdaki sınamak için nasıl emin değilim ... Bu bir olasılık olduğunu ve eğer öyleyse onu nasıl mücadele edebilir?

2 Cevap

Kullanıcı bir görüntü düzenleme başladığında son değişiklik damgası saklayın. Onların değişiklikleri gönderdiğinizde, yine son değişiklik damgası karşı kontrol edin. Bu farklı, başka bir kullanıcı zaten görüntüyü değiştirdi daha kullanıcıyı bilgilendirmek.

Siz kullanıcı üzerine yazmak için seçmeden önce görüntünün yeni sürümünü görmek izin isteyebilirsiniz. Ayrıca, insanların değişiklikleri geri çevirelim (a la wikipedia) bir sürüm kontrol sistemi sağlamak isteyebilirsiniz.

EDIT (aşağıda yorumlarına yanıt olarak)

  1. Son değiştirilme zaman damgası (veya belki de ek olarak) depolama aksine, orijinal görüntünün bir karma saklayın. ve üzerine hemen önce olanlar karşılaştırabilirsiniz. Aksi takdirde, yukarıdaki gibi aynı.

  2. Eğer önerilen diğer seçenek de iyi çalışır. senin iş akışında 3. adımda oluşturduğunuz bir bir var eğer [GörüntüDosyaAdı] sonra,. dosya kilitlemek (ya da orada saklanır eğer DB alan değiştirme) biri zaten elbette, yoksa sürecin başında yukarıdaki gibi aynı.

  3. To expand on the DB option in point 2 above, it would be much simpler to have a table like: image_id | image_data

    Eğer (isteğe bağlı db yükü azaltmak yerine php md5 hesaplamak) başladığınızda sorgu md5 dahil

    select image_data, md5(image_data) from image_table where image_id=1
    

    Geri yazmak istiyorsanız o zaman, yapılacak

    update image_table set image_data=? where image_id=? and md5(image_data)=?
    

    Bu md5 üzerine önce özdeş olmanın güncelleme koşullu yapar ve tek bir basit sorguda kalır.

    Sonra affected_rows kontrol edin. Etkilenen satır olsaydı, o zaman karma kontrol edin. Karma farklı ise o zaman muhtemelen sorgu nedeniyle md5 kontrol güncellemek için başarısız oldu. (Not: muhtemelen de herhangi bir mysql hataları kontrol etmek isteyebilirsiniz)

Ah, ne temelde istediğiniz orijinal görüntüler ile ilgili delta tasarruf edilir.

Tek yol:

  1. Bir kullanıcı Fred orijinal kaynak görüntü I1 getirir ve düzenler. Fred mesajlar yepyeni bir görüntüyü geri N1
  2. You compute the delta of the image D1, that is {N1 - O}. Instead of saving just overwriting N1, you retrieve the current image I2 from disk which might have been changed in the meantime (I1 doesn't need to equal I2) . You apply D1 to I1 and overwrite the image with the resulting image, which we call I3.
    Beware, you need to remember I1 for this to work in $_SESSION for example.
  3. Now an other Ria could edit the same image during the previous steps. For instance, shortly after Fred got I1, Ria got it too. Just before Ria has finished her work, Fred has had his delta saved on disk resulting in I3, like we saw. So what now? You blindly apply step 2. I will show what happens: User2 submits his work N2, the delta D2 is computed by comparing I1 with N2 (The session for Ria contains I1). The current image is retrieved from disk, which is I3 as you might correctly remember. This delta D2 is applied to I3 resulting in I4, which is saved to disk. Result is that Ria has overwrited I3, but only those parts she has actually edited.

This recipe will work, because file saving is an atomic operation in php.

To get this working:

  1. Bir kullanıcı bir ben düzenlemek için bir görüntü alırken, ben A'nın oturumda saklanması gerekir sağlamak gerekir. Kolay.
  2. Siz görüntünün bir diff hesaplamak ve bir görüntü bu diff uygulamak gerekiyor. Bu, örneğin imagemagick's compare function ile mümkün olmalıdır. Bu el değmemiş o sizin fark beyaz piksel göreceksiniz ki url örneği vardır bakıyor.