6

入力をテキストファイルに書き込むフォームがあります。編集のためにテキスト ファイルをロックし、「ファイルは別のユーザーによって編集されています。後でもう一度やり直してください」というわかりやすいメッセージを表示することは可能でしょうか。

ファイルに同時に複数の編集者がいる場合、競合を避けたいと思います。

エントリが現在どのように追加されているかを次に示します。

$content = file_get_contents("./file.csv");
$fh = fopen("./file.csv", "w");
fwrite($fh, $date_yy . '-' . $date_mm . '-' . $date_dd . '|' . $address . '|' . $person . '|' . $time_hh . ':' . $time_mm) ;
fwrite($fh, "\n" . $content);
fclose($fh);

何かご意見は?

4

5 に答える 5

4

関数を使用flock()してファイルをロックできます。詳細については、これを参照してください

何かのようなもの:

   <?php

      $content = file_get_contents("./file.csv");
      $fp = fopen("./file.csv", "w"); // open it for WRITING ("w")
      if (flock($fp, LOCK_EX)) 
      {
      // do your file writes here
      fwrite($fh, $date_yy . '-' . $date_mm . '-' . $date_dd . '|' . $address . '|' .  $person . '|' . $time_hh . ':' . $time_mm);
      fwrite($fh, "\n" . $content);
      fclose($fh);
      flock($fh, LOCK_UN); // unlock the file
      } 
   ?> 
于 2013-03-15T15:05:28.830 に答える
2

望ましい順に並べると、次のようになります。

  1. データベースを使用します。
  2. 複数のテキスト ファイルを使用します。
  3. ロックを使用する:

例えば:

$lockwait = 2;       // seconds to wait for lock
$waittime = 250000;  // microseconds to wait between lock attempts
// 2s / 250000us = 8 attempts.
$myfile = '/path/to/file.txt';

if( $fh = fopen($myfile, 'a') ) {
  $waitsum = 0;
  // attempt to get exclusive, non-blocking lock
  $locked = flock($fh, LOCK_EX | LOCK_NB); 
  while( !$locked && ($waitsum <= $lockwait) ) {
    $waitsum += $waittime/1000000; // microseconds to seconds
    usleep($waittime);
    $locked = flock($fh, LOCK_EX | LOCK_NB);
  }
  if( !$locked ) {
    echo "Could not lock $myfile for write within $lockwait seconds.";
  } else {
    // write out your data here
    flock($fh, LOCK_UN);  // ALWAYS unlock
  }
  fclose($fh);            // ALWAYS close your file handle
} else {
  echo "Could not open $myfile";
  exit 1;
}
于 2013-03-15T15:06:07.843 に答える
1

PHP の flock 関数を使用して書き込み用にファイルをロックできますが、そのロックは Web リクエスト間で持続せず、NFS マウントでは機能しません (少なくとも私の経験では)。

同じディレクトリにトークン ファイルを作成し、その存在を確認し、存在する場合はエラーを報告することをお勧めします。

他のロック スキームと同様に、操作が完了した後も競合状態とロックが残るため、それらを軽減する方法が必要になります。

その値を編集してロックファイルに保存する前に、ファイルのハッシュを作成することをお勧めします。また、そのハッシュを編集フォームの一部としてクライアントに送信します (コミット要求のデータとして返されます)。書き込む前に、渡されたハッシュ値をファイル内の値と比較します。それらが同じである場合は、データをコミットしてロックを解除します。

異なる場合は、エラーを表示します。

于 2013-03-15T15:19:19.730 に答える
0

あなたは試すことができflock — Portable advisory file lockingますか?

http://php.net/manual/en/function.flock.php

于 2013-03-15T15:05:46.050 に答える
-1

単純な整数などを使用します。

  $content = file_get_contents("./file.csv");
  $fh = fopen("./file.csv", "w");
  $status = 1;

...      

if($status == 1){
   fwrite($fh, $date_yy . '-' . $date_mm . '-' . $date_dd . '|' . $address . '|' . $person . '|' . $time_hh . ':' . $time_mm);
   fwrite($fh, "\n" . $content);
   fclose($fh);
   $status = 0;
  }
else
     echo "the file is edited by another user, please try again later.";

そうですか?

于 2013-03-15T15:05:35.683 に答える