Frage

Ich bin auf der Suche, um mehrere Benutzer Bearbeiten das gleiche Bild mit der gd-Bibliothek ist imagecopymerge Funktion.

Ich bin besorgt, dass zwei Benutzer könnte wählen Sie zum Bearbeiten des Bildes an der gleichen Zeit.Die Anwendung dann verschmelzen die zwei Benutzer, die Bilder separat und schließlich spart Ihnen aber eine überschreibt das andere, und so der Benutzer, die Bilder fehlen.

Ich bin mir nicht sicher, wie Sie testen Sie die oben...ist es eine Möglichkeit und wenn ja wie kann ich Sie bekämpfen?

War es hilfreich?

Lösung

Speichern Sie die zuletzt geänderten Zeitstempel, wenn der Benutzer beginnt mit der Bearbeitung eines Bildes.wenn Sie Einreichen Ihre änderungen, check gegen den zuletzt geänderten Zeitstempel wieder.Wenn es anders ist, informieren Sie den Benutzer als ein anderer Benutzer hat bereits verändert das Bild.

Möchten Sie vielleicht lassen Sie die Benutzer sehen die neue version der Bild vor der Auswahl zu überschreiben.Vielleicht möchten Sie auch, um eine version control system (a-la-wikipedia) zu lassen, Menschen Rollback von änderungen.

BEARBEITEN (In Reaktion auf die Kommentare unten)

  1. Im Gegensatz zur Speicherung der zuletzt geänderten Zeitstempel (oder vielleicht auch zusätzlich zu), speichern einen hash des ursprünglichen Bildes.und vergleichen Sie diese unmittelbar vor dem überschreiben.Sonst wie oben.

  2. Die andere option, wie Sie vorgeschlagen würde auch gut funktionieren.im 3. Schritt in Ihrem workflow erstellen [imagefilename].lock-Datei (oder ändern Sie ein Feld in der DB, wenn Sie dort gespeichert sind) am Anfang des Prozesses, wenn man nicht bereits vorhanden ist, natürlich, wenn einer vorhanden ist, dann das gleiche wie oben.

  3. Erweitern Sie auf der DB-option in Punkt 2 oben, wäre es viel einfacher, einen Tisch zu haben wie:image_id | image_data

    Abfrage mit den md5, wenn Sie beginnen (Optional berechnen Sie den md5 in php, anstatt Sie zu reduzieren die Belastung auf Ihre db)

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

    Dann, wenn Sie wollen, wieder zu schreiben, tun

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

    Dies macht das update an die Bedingung geknüpft, md5 identisch ist, bevor Sie überschrieben werden, und es bleibt in einer einzigen, einfachen Abfrage.

    Dann überprüfen Sie die affected_rows.Wenn keine Zeilen betroffen waren, dann überprüfen Sie den hash.Wenn der hash ein anderer ist, dann vermutlich der Abfrage nicht aktualisieren konnte wegen dem md5 check.(Hinweis:Sie werden wahrscheinlich wollen auch zu prüfen, ein mysql-Fehler)

Andere Tipps

Ach, was Sie im Grunde wollen, ist das speichern der delta mit Bezug auf die ursprünglichen Bilder.

Eine Möglichkeit:

  1. Ein Benutzer Fred holt die ursprüngliche Quelle Bild I1 und bearbeitet es.Fred Beiträge auf die gesamte neue Bild N1
  2. Sie berechnen das delta des Bildes D1,, dass ist {N1 - O}.Anstatt zu sparen, nur überschreiben N1, rufen Sie die aktuellen Bild I2 von der Festplatte, die möglicherweise geändert wurden, die in der Zwischenzeit (I1 muss nicht gleich I2) .Sie gelten D1 bis I1 und überschreiben Sie das Bild mit dem resultierenden Bild, das wir nennen I3.
    Hüten Sie sich vor, Sie müssen sich daran erinnern I1 für diese Arbeit in $_SESSION zum Beispiel.
  3. Nun ein anderes Ria Bearbeiten könnten das gleiche Bild, während Sie die vorherigen Schritte.Zum Beispiel, kurz nach Fred bekam I1, Ria hat es dann auch.Kurz vor Ria beendet Ihre Arbeit, Fred hatte sein delta auf der Festplatte gespeichert wodurch I3, wie wir sahen.Also was jetzt?Sie blind anwenden Schritt 2.Ich werde zeigen, was passiert:User2 sendet seine Arbeit N2, D2 delta ist berechnet durch den Vergleich von I1 mit N2 (Die Sitzung für Ria enthält I1).Das aktuelle Bild von der Festplatte abgerufen wird, der I3 wie Sie vielleicht richtig erinnern.Diese delta-D2 ist angewendet I3 wodurch I4, die auf der Festplatte gespeichert werden.Ergebnis ist, dass die Ria hat überschrieben I3, aber nur die Teile, die Sie tatsächlich bearbeitet.

Dieses Rezept funktioniert, weil die Datei speichern ist eine Atomare operation in php.

Damit dies funktioniert:

  1. Sie müssen sicherstellen, dass, wenn ein Benutzer a ruft eine Bild, das ich zu Bearbeiten, ich muss gespeichert werden in Einer Sitzung.Einfach.
  2. Sie müssen in der Lage sein zu berechnen, ein diff, das das Bild, und verwenden Sie diesen diff auf ein Bild.Dies sollte möglich sein, mit imagemagick vergleichen Funktion zum Beispiel.Blick auf das Beispiel der url werden Sie sehen, dass in den diff-weiße Pixel sind diejenigen, unberührt.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top