11

いくつかの情報をプレーンテキストファイルに保存する小さな Web アプリを PHP で構築しています。ただし、このテキスト ファイルは、特定の時点でアプリのすべてのユーザーによって使用/変更され、同時に可能です。

質問はそうです。特定の時点で 1 人のユーザーだけがファイルを変更できるようにする最善の方法は何でしょうか?

4

4 に答える 4

23

ファイルをロックする必要があります

    $fp = fopen("/tmp/lock.txt", "r+");

if (flock($fp, LOCK_EX)) {  // acquire an exclusive lock
    ftruncate($fp, 0);      // truncate file
    fwrite($fp, "Write something here\n");
    fflush($fp);            // flush output before releasing the lock
    flock($fp, LOCK_UN);    // release the lock
} else {
    echo "Couldn't get the lock!";
}

fclose($fp);

http://www.php.net/flockを見てください

于 2008-11-16T08:57:27.663 に答える
11

私の提案は、SQLite を使用することです。高速で軽量で、ファイルに保存され、同時変更を防止するメカニズムがあります。既存のファイル形式を扱っていない限り、SQLite が最適です。

于 2008-11-16T07:05:54.847 に答える
3

ウィキペディアのように、コミットログのような形式を実行できます。

データベースを使用すると、保存された変更ごとにデータベースに新しい行が作成されます。これにより、前のレコードが冗長になり、値が増加します。保存フェーズ中にテーブルロックを取得することだけを心配する必要があります。

そうすれば、少なくとも 2 人の人が同時に何かを編集した場合、両方の変更が履歴に表示され、コミット合戦で失われたものを新しいリビジョンにコピーできます。

データベースを使用したくない場合は、すべての可視ファイルをバックアップするリビジョン コントロール ファイルを用意する必要があります。

リビジョン コントロール ( GIT/MERCURIAL/SVN ) をファイル システムに配置し、保存フェーズでコミットを自動化できます。

擬似コード:

 user->save : 
   getWritelock(); 
   write( $file ); 
   write_commitmessage( $commitmessagefile ); # <-- author , comment, etc 
   call "hg commit -l $commitmessagefile $file " ; 
   releaseWriteLock(); 
 done.

少なくともこの方法では、2 人が同時に重要なコミットを行った場合、どちらも失われません。

于 2008-11-16T08:20:07.817 に答える
2

多くのユーザーに対して単一のファイルを使用する戦略は、実際には使用すべきではないと思います。そうしないと、おそらく、ファイルが現在編集されているかどうかを監視する単一の (グローバル) アクセス ポイントを実装する必要があります。ロックを取得し、変更を行い、ロックを解放します。データベースを使用するという誰も提案しないでください (完全に構築された RDBMS のオーバーヘッドが必要ない場合は SQLite を使用します)。

于 2008-11-16T07:55:33.577 に答える