端くれプログラマの備忘録 PHP [PHP] ファイルをロックして書き込む (排他制御)

[PHP] ファイルをロックして書き込む (排他制御)

複数のプロセスが同じファイルに書き込むような場合には排他制御が必要になる。

しかし、書き込もうとしたファイルが既に別プロセスによってロックされていた場合に「ロックされていたので書けませんでした」と言われても困る。別プロセスがファイルのロックを解除するのを待って書き込んでもらわないと。

以下は、ファイルをロックできなかった場合には一定時間ウェイトしてからファイルへの書き込みを試行する、というリトライ付きのログ書き出し関数の例。

define('LOG_FILE', "test.log");
define('RETRY_COUNT', 5);

function writeLog($message) {
    $fh = fopen(LOG_FILE, 'a');
    for ($i = 0; $i < RETRY_COUNT; $i++) {    // retry loop
        if (flock($fh, LOCK_EX)) {
            fwrite($fh, $data);
            fflush($fh);
            flock($fh, LOCK_UN);
            break;  // success
        }
        sleep(1);   // wait
    }
    fclose($fh);
}

writeLog("Hello.");
writeLog("How are you?");