最近、仕事で PHP を勉強していて、次のコードを使用してファイル ハンドルをロックするという問題が発生しました
。
[php]
$ファイル名 = "/tmp/lock.txt";
$fp = fopen($ファイル名, "r+");
if (!$fp) {
Die(「オープンに失敗しました。」);
}
if (flock($fp, LOCK_EX)) { // 排他ロックを実行します
睡眠(20);
$count = (int)fgets($fp);
$カウント += 1;
fseek($fp, 0);
fwrite($fp, (string)$count);
fflush($fp); // ロックを解放する前に出力をフラッシュします
flock($fp, LOCK_UN); // ロックを解除します
} その他 {
echo "ロックを取得できませんでした!";
}
fclose($fp);
?>
$filename = "/tmp/lock.txt";
$fp = fopen($filename, "r+");
if (!$fp) {
Die(「オープンに失敗しました。」);
}
if (flock($fp, LOCK_EX)) { // 排他ロックを実行します
$count = (int)fgets($fp);
$count += 1;
fwrite($fp, (string)$count);
fflush($fp); // ロックを解放する前に出力をフラッシュします
flock($fp, LOCK_UN); // ロックを解除します
} その他 {
}
fclose($fp);
?>
アクセスし、スリープ後 20 秒以内に vi を使用して /tmp/lock.txt を編集してみると、最初のスクリプトの終了を待たずにファイルの内容が正常に変更できることがわかります。ドキュメントをじっくり読んだ結果、ここには「協議的ファイル ロック」と呼ばれる概念があることがわかりました。これは、アクセスするすべてのプログラムが同じロック メソッドを使用しないと機能しないことを意味します。
次のコードを使用して 20 秒以内にアクセスしてみてください:
[php]
$ファイル名 = "/tmp/lock.txt";
$fp = fopen($ファイル名, "r+");
if (!$fp) {
Die(「オープンに失敗しました。」);
}
$count = (int)fgets($fp); エコー $カウント
$カウント += 1; flock($fp, LOCK_UN); // ロックを解除します
} その他 {
echo "ロックを取得できませんでした!";
}
fclose($fp);
?>
$filename = "/tmp/lock.txt";
$fp = fopen($filename, "r+");
if (!$fp) {
Die(「オープンに失敗しました。」);
}
if (flock($fp, LOCK_EX)) { // 排他ロックを実行します
$count = (int)fgets($fp);
エコー $count;
$count += 1;
flock($fp, LOCK_UN); // ロックを解除します
} その他 {
echo "ロックを取得できませんでした!";
}
fclose($fp);
?>
ブロックが成功したことがわかりました (2 番目のスクリプトは、実行を続ける前に、最初のスクリプトが終了するまで待つ必要があります)。
それでは、同じようにロックとは何ですか?
1. スクリプト 1 の flock パラメータを LOCK_SH に変更してみます。テスト後、ブロックは依然として成功していることがわかります。
2. スクリプト 1 とスクリプト 2 の両方の flock パラメーターを LOCK_SH に変更してみて、スクリプト 2 がスクリプト 1 の実行の終了を待たずに結果を返すことができることを確認します。
グループB:
1. スクリプト 2 の fopen パラメータを「r」に変更してみます。現象はグループ A と同じです。
1. スクリプト 1 を変更せずに、スクリプト 2 の flock パラメーターを LOCK_SH に変更してみます。
http://www.bkjia.com/PHPjc/477596.html
www.bkjia.com
true
http://www.bkjia.com/PHPjc/477596.html
技術記事