flock関数の使い方

PHPのflock関数の使い方 PHP言語リファレンス
PHPのflock関数の使い方
zucksadnetwork

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関数の書き方は、次のとおりです。

  1. ファイルハンドルを取得します。
  2. 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を返します。この場合は、ファイルの処理を中断する必要があります。