flock

関数の概要

PHPのflock関数は、ファイルをロックするために使われます。複数のプロセスやスクリプトが同じファイルに同時アクセスする際の競合を防ぎ、安全にファイル操作を行うために必須の機能です。特に、ログファイルの追記やキャッシュファイルの操作時に利用されます。

パラメータの説明

  • $stream:ロック対象のファイルポインタ。fopenなどで開いたファイルのリソースを指定します。
  • $operation:ロック操作の種類を指定する定数。以下のいずれかをセットします。
    • LOCK_SH:共有ロック(読み込み時に使用)
    • LOCK_EX:排他ロック(書き込み時に使用)
    • LOCK_UN:ロック解除
    • LOCK_NB:ノンブロッキングモード。ロックできなければ即時に失敗を返す

戻り値

ロックに成功した場合は true、失敗した場合は false を返します。たとえば、別のプロセスが排他ロックを保持している場合、取得に失敗します。

使用例

基本的な使い方

<?php
$fp = fopen('sample.txt', 'r+');
if (flock($fp, LOCK_EX)) {  // 排他ロックを取得
    // ファイルの読み書き処理
    ftruncate($fp, 0);
    fwrite($fp, "Hello Worldn");
    fflush($fp);            // バッファをフラッシュ
    flock($fp, LOCK_UN);    // ロック解除
} else {
    echo "ファイルロックに失敗しました。";
}
fclose($fp);
?>

ファイルを排他ロックし、内容を変更しています。ロックを取得できなければエラーメッセージを表示します。

共有ロックによる読み込み

<?php
$fp = fopen('sample.txt', 'r');
if (flock($fp, LOCK_SH)) {  // 共有ロック取得
    while (($line = fgets($fp)) !== false) {
        echo $line;
    }
    flock($fp, LOCK_UN);    // ロック解除
} else {
    echo "ファイルを読み込めませんでした。";
}
fclose($fp);
?>

読み込み時は共有ロックを使い、他プロセスの書き込みを防ぎつつ複数読み込みを許可します。

ノンブロッキングモードでの排他ロック

<?php
$fp = fopen('sample.txt', 'a');
if (flock($fp, LOCK_EX | LOCK_NB)) {  // ノンブロッキング排他ロック
    fwrite($fp, "追加のデータn");
    fflush($fp);
    flock($fp, LOCK_UN);
} else {
    echo "ロック中のため書き込みできません。";
}
fclose($fp);
?>

ノンブロッキングモードを指定すると、ロック待ちせず失敗を即座に返します。処理時間を抑えたい場面で有効です。

関連する関数

  • fopen:ファイルを開くために必要
  • fclose:ファイルを閉じる
  • fwrite:ファイルに書き込む
  • ftruncate:ファイルの長さを切り詰める
  • fflush:出力バッファをフラッシュし、書き込みを強制する

まとめ

flockは、PHPで安全にファイル操作を行うための基本的なロック機構です。複数の処理が同時にファイルへアクセスする際に、データの破損や競合を防止できます。共有ロック(読み込み)と排他ロック(書き込み)の使い分けが重要であり、ノンブロッキングモードも活用すれば処理の柔軟性が向上します。実務ではログファイルやキャッシュファイルの排他制御に頻繁に利用されるため、PHPでファイル操作を行う際にはぜひ覚えておきたい関数です。