flock関数とは?
flock関数は、PHPでファイルの排他制御を行うための関数です。
flock関数の概要
flock関数の基本的な書式は、次のとおりです。
PHP
bool flock(resource $handle, int $operation);
resource $handle
:ファイルハンドルint $operation
:操作
flock関数は、ファイルハンドルを指定して、操作を実行します。操作は、次のとおりです。
LOCK_SH
:読み取り専用でロックするLOCK_EX
:書き込み専用でロックするLOCK_UN
:ロックを解除する
flock関数の書き方
flock関数の書き方は、次のとおりです。
- ファイルハンドルを取得します。
- flock関数を呼び出して、操作を実行します。
PHP
// ファイルハンドルの取得
$handle = fopen($filename, "r");
// ファイルの排他制御を取得する
$result = flock($handle, LOCK_EX);
// ファイルの処理を行う
// ファイルの排他制御を解除する
flock($handle, LOCK_UN);
このコードは、example.txtというファイルを読み込みモードで開き、ファイルの排他制御を取得して、ファイルの処理を行った後、排他制御を解除するコードです。
flock関数の作成・使用方法
flock関数は、次の2つの方法で使用できます。
- ファイル操作の処理をまとめた関数として作成する
- ファイル操作の処理を直接行う
PHP
// ファイル操作の処理をまとめた関数として作成
function read_file_with_lock(string $filename) {
// ファイルハンドルの取得
$handle = fopen($filename, "r");
// ファイルの排他制御を取得する
$result = flock($handle, LOCK_EX);
if ($result === false) {
// 排他制御の取得に失敗した場合
return false;
}
// ファイルの処理を行う
$content = fread($handle, filesize($filename));
// ファイルの排他制御を解除する
flock($handle, LOCK_UN);
return $content;
}
// ファイル操作の処理を直接行う
$filename = "example.txt";
// ファイルハンドルの取得
$handle = fopen($filename, "r");
// ファイルの排他制御を取得する
$result = flock($handle, LOCK_EX);
// ファイルの処理を行う
$content = fread($handle, filesize($filename));
// ファイルの排他制御を解除する
flock($handle, LOCK_UN);
// ファイルの内容を表示
echo $content;
flock関数のスクリプトサンプル
次のスクリプトは、flock関数を使用して、さまざまなファイルの排他制御を行っています。
PHP
// ファイルの排他制御の取得と解除をテストする
// ファイルの作成
$filename = "example.txt";
$content = "Hello, world!";
fwrite($handle, $content);
// ファイルの排他制御を取得する
$handle = fopen($filename, "r");
$result = flock($handle, LOCK_EX);
// ファイルの排他制御が取得できた場合
if ($result === true) {
// ファイルの内容を表示
echo $content;
}
// ファイルの排他制御を解除する
flock($handle, LOCK_UN);
// ファイルの内容を更新する
$content = "Goodbye, world!";
fwrite($handle, $content);
このコードは、example.txtというファイルを作成し、”Hello, world!”と書き込み、ファイルの排他制御を取得して、ファイルの内容を表示し、排他制御を解除してから、”Goodbye, world!”と更新するコードです。
flock関数特有の事柄・注意点
- flock関数は、ファイルのオープンと同時に排他制御を取得する必要があるため、fopen関数の後に flock関数を呼び出す必要があります。
PHP
// 正しい書き方
$handle = fopen($filename, "r");
$result = flock($handle, LOCK_EX);
// 誤った書き方
flock($handle, LOCK_EX);
$handle = fopen($filename, "r");
- flock関数の操作は、ロックを取得する順序で解除する必要があります。
PHP
// 正しい書き方
flock($handle, LOCK_EX);
// ファイルの処理を行う
flock($handle, LOCK_UN);
// 誤った書き方
flock($handle, LOCK_EX);
// ファイルの処理を行う
flock($handle, LOCK_UN);
- flock関数で排他制御を取得できなかった場合は、falseを返します。この場合は、ファイルの処理を中断する必要があります。
PHP
$handle = fopen($filename, "r");
$result = flock($handle, LOCK_EX);
if ($result === false) {
// 排他制御の取得に失敗した場合
// 処理を中断する
}
flock関数のまとめ
flock関数は、PHPでファイルの排他制御を行うための便利な関数です。PHPの初心者でも使いやすいので、ぜひ覚えておきましょう。
flock関数を使用する際の注意点は、次のとおりです。
- flock関数は、ファイルのオープンと同時に排他制御を取得する必要があるため、fopen関数の後に flock関数を呼び出す必要があります。
- flock関数の操作は、ロックを取得する順序で解除する必要があります。
- flock関数で排他制御を取得できなかった場合は、falseを返します。この場合は、ファイルの処理を中断する必要があります。