2013-02-27 5 views
10

Ich bin auf der Suche nach Möglichkeiten zur Implementierung von Dateisystemoperationen mit PHP mit Transaktionsunterstützung. Wie bei Operationen wie Verschieben, Kopieren und Löschen innerhalb einer Transaktion muss das Skript alle bereits ausgeführten Operationen rückgängig machen. Ich bin irgendwie ahnungslos und suche Führung, wie es erreicht werden kann. Und wenn vorhandene Bibliotheken oder Lösungen vorhanden sind? Ich entschuldige mich, wenn die Frage vage klingt.Wie führen Sie Dateisystemoperationen in Transaktion mit PHP aus?

+0

Verwenden Sie möglicherweise ein Singleton-Entwurfsmuster, um eine Instanz eines Objekts zu erstellen, das eine Liste der verarbeiteten und abgeschlossenen Ereignisse und einen Algorithmus erstellt, der die Umkehrung jeder dieser Funktionen darstellt (z. B. die Positionen von <-> TO). Wenn es aus irgendeinem Grund fehlschlägt, führen Sie die Instanz aus, die alle vorgenommenen Änderungen rückgängig machen würde. – MaxSan

Antwort

2

Filesysteme unterstützen im Gegensatz zu Datenbankverwaltungssystemen keine Transaktionen. Einige bieten jedoch die Dinge, die Sie für die Implementierung von Transaktionen benötigen. das ist Sperren und Protokollieren. Logging wird nicht dein Problem sein, weil du es auch in PHP machen kannst, aber du brauchst ein Dateisystem, das Dateisperren bietet.

Ich empfehle Ihnen, nichts dergleichen selbst zu implementieren - es gibt viele Probleme, denen Sie begegnen könnten. Die Datenbank-Leute blicken hier auf eine Forschungsgeschichte von Jahrzehnten zurück.

Aber wenn Sie müssen, könnten Sie (zum ersten Mal) etwas wie Two-phase locking in PHP implementieren. Sie können auch die command pattern verwenden, die Ihnen beim Rückgängigmachen der Funktionalität für Ihr Rollback hilft.

3

Eine Option besteht darin, Ihre Dateien als BLOBs in der Datenbank und nicht als Dateien zu speichern. Diese unterstützen Transaktionen und alle anderen Funktionen Ihrer Datenbank.

Es ist möglich, Transaktionen mit erweiterten Dateisystemen wie ZFS, aber nicht direkt mit PHP zu unterstützen, und ZFS wird standardmäßig nicht unter Linux installiert.

3

Das gebräuchlichste Muster dafür ist, alles an einen anderen Ort zu kopieren, die Kopie zu bearbeiten und die Originale zu ersetzen, wenn alles gut geht.

Etwas sagt mir, dass PHP-Stream-Wrapper auch dafür nützlich sein könnten. Es ist möglich, das Protokoll "file: //" zu überschreiben und in einem virtuellen Dateisystem zu arbeiten (Proof of Concept: https://github.com/Respect/Test#streamwrapper).

Verwandte Themen