ホームページ  >  記事  >  バックエンド開発  >  PHP アドバイザリー ファイルのロック: flock_PHP チュートリアル

PHP アドバイザリー ファイルのロック: flock_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-14 10:10:021255ブラウズ

最近、仕事で 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)) { // 排他ロックを実行します

睡眠(20);

$count = (int)fgets($fp);
$count += 1;

fseek($fp, 0);

fwrite($fp, (string)$count);
fflush($fp); // ロックを解放する前に出力をフラッシュします
flock($fp, LOCK_UN); // ロックを解除します
} その他 {

echo "ロックを取得できませんでした!";

}

fclose($fp);
?>
アクセスし、スリープ後 20 秒以内に vi を使用して /tmp/lock.txt を編集してみると、最初のスクリプトの終了を待たずにファイルの内容が正常に変更できることがわかります。ドキュメントをじっくり読んだ結果、ここには「協議的ファイル ロック」と呼ばれる概念があることがわかりました。これは、アクセスするすべてのプログラムが同じロック メソッドを使用しないと機能しないことを意味します。

次のコードを使用して 20 秒以内にアクセスしてみてください:


[php]
$ファイル名 = "/tmp/lock.txt";

$fp = fopen($ファイル名, "r+"); if (!$fp) {
Die(「オープンに失敗しました。」); }

if (flock($fp, LOCK_EX)) { // 排他ロックを実行します

$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 番目のスクリプトは、実行を続ける前に、最初のスクリプトが終了するまで待つ必要があります)。

それでは、同じようにロックとは何ですか?

グループA:



1. スクリプト 1 の flock パラメータを LOCK_SH に変更してみます。テスト後、ブロックは依然として成功していることがわかります。
2. スクリプト 1 とスクリプト 2 の両方の flock パラメーターを LOCK_SH に変更してみて、スクリプト 2 がスクリプト 1 の実行の終了を待たずに結果を返すことができることを確認します。
グループB:


1. スクリプト 2 の fopen パラメータを「r」に変更してみます。現象はグループ A と同じです。

グループC:


1. スクリプト 1 を変更せずに、スクリプト 2 の flock パラメーターを LOCK_SH に変更してみます。

http://www.bkjia.com/PHPjc/477596.html


www.bkjia.com

tru​​e

http://www.bkjia.com/PHPjc/477596.html

技術記事

最近、仕事で PHP を勉強していて、次のコードを使用してファイル ハンドルをロックしました。 [php] $filename = /tmp/lock.txt; $fp = fopen($filename, r+); ..

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。