2013-02-27 16 views
10

私は、トランザクションサポート付きのPHPを使用してファイルシステム操作を実装する方法を探しています。トランザクション内での移動、コピー、削除などの操作を実行している場合と同様に、いずれかが失敗した場合、スクリプトはすでに実行された操作をすべて元に戻す必要があります。私は一味違って、どのように達成できるか指導を求めています。利用可能なライブラリやソリューションが存在する場合は?質問があいまいに聞こえる場合はお詫び申し上げます。PHPとのトランザクションでファイルシステム操作を実行するには?

+0

シングルトンのデザインパターンを使用して、処理されたイベントのリストを作成するオブジェクトのインスタンスを作成し、これらのそれぞれを逆転させるアルゴリズムを使用することができます(たとえば、FROM <->をポジションに切り替えます)。なんらかの理由で失敗した場合、実行されたすべての変更を取り消すインスタンスを実行します。 – MaxSan

答えて

2

ファイルシステムは、データベース管理システムとは異なり、トランザクションをサポートしていません。ただし、トランザクションを実装するために必要なものを提供するものもあります。それはロックとロギングです。あなたはPHPでもそれを行うことができるので、ロギングはあなたの問題ではありませんが、ファイルロックを提供するファイルシステムが必要です。

このようなことは実装しないことをお勧めします。遭遇する可能性がある問題はたくさんあります。データベースの人たちはここ10年間の研究の歴史を振り返ります。

しかし、あなたがする必要があれば(最初は)Two-phase lockingのようなものを実装することができます。また、ロールバックの取り消し機能に役立つcommand patternの使用を検討することもできます。

3

ファイルとしてではなく、データベースにBLOBとしてファイルを格納することを検討してください。これらはトランザクションとデータベースの他のすべての機能をサポートします。

ZFSのような高度なファイルシステムでトランザクションをサポートすることはできますが、PHPでは直接行うことはできません。また、ZFSはデフォルトでLinuxにインストールされません。

3

最も一般的なパターンは、すべてをどこか別の場所にコピーし、コピーを操作し、すべてがうまくいけばオリジナルを置き換えます。

何かは、PHPストリームラッパーがこれにも役立つ可能性があることを私に伝えます。 'file://'プロトコルを無効にして、仮想ファイルシステム(概念の証明:https://github.com/Respect/Test#streamwrapper)で操作することが可能です。

関連する問題