排他制御にロック用ファイルを使用する
PHPで処理の排他制御を実現する際、ロック専用ファイルを用いる方法を解説します。
🔰排他制御とは
本題のロック用ファイルの解説の前に、念のため、Webシステムにおける「排他制御」について解説しておきます。
排他制御とはサーバ上のファイルへの読み書き操作やデータベースの更新など、リソースに対して複数のユーザから同時に処理が行われると結果の不整合及び、エラーが発生する可能性のある場合に、先に行われた処理が完了するまで次の処理を待ち状態にすることや処理を意図的に失敗させる仕組みのことです。
ロック専用ファイルってどういうこと?
PHPではファイルへの読み書きのにflock関数を使用することで対象のファイルにロックをかけることができ、ロックがかかっている間、他のユーザによる同様のロックを失敗させる仕組みで排他制御を実現します。
こちらを利用し、目的の処理を行う直前にサーバ上の専用ファイルにロックをかけ、処理が完了するまではファイルのロックを解除しないようにすることで、その処理自体にも排他制御を行うことができるようになります。
<?php
$lock_fp = fopen('./lock.txt', 'w');
// ロックをかける & ロックの獲得結果を判定する
if (!flock($lock_fp, LOCK_EX + LOCK_NB)) {
// ユーザ通知など、排他制御時の処理
exit;
}
// 目的の処理実行 なにか
func1();
...
// 目的の処理実行完了後にファイルのロックを解除
flock($lock_fp, LOCK_UN);
上記ではロック専用ファイルとしてプログラムと同じ階層に存在するテキストファイルを使用していますが、任意の形式のもので問題ありません。
※ fopenできるように事前にファイルの権限設定(パーミッション設定)をしておく必要があります。