PHP ファイルロックで排他処理

ファイルロック
2014/01/31

ファイルロックで排他処理

概要

PHPのflock関数を使って排他処理を行う方法を紹介しています。
Webアプリでは、複数のプロセスが同時に実行されますが、処理によっては競合してしまいエラーとなるものもあります。

そういった時に、flock関数のファイルロックする機能を利用して、同時に処理が行われないよう実装します。

サンプルコード

flock関数の説明

基本的には次のような流れで処理を行います。

  • ロックするファイルをfopen関数で開く
  • flock関数でモードを指定してロック
  • fclose関数で解放

ロックモードは次のものが指定できます。

定数 説明
LOCK_SH 共有ロック。ロックされていた場合は解除されるまで待つ。
LOCK_EX 排他的ロック。ロックされていた場合は解除されるまで待つ。
LOCK_UN ロックを解除。
LOCK_SH | LOCK_NB 共有ロック。ロックされていた場合はfalseを返す。(Windowsではサポートされない。)
LOCK_EX | LOCK_NB 排他的ロック。ロックされていた場合はfalseを返す。(Windowsではサポートされない。)

LOCK_NBはWindowsではサポートされていませんが、試したところ使えました。
なぜでしょう。。。

普通にロック

まずは普通にファイルロックを使用して、複数アクセス時にも処理が被らないようにします。


$lock=$this->start_lock();
~処理~
fclose($lock);

function start_lock()
{
	$lock = 'hoge.lock';

	if (!$fp=fopen($lock, "a")) die("can't lock");
	flock($fp, LOCK_EX);
	return $fp;
}

グループ化してみる

グループ化してロックしたい場合は、ロックモードを使い分けて行います。


//一つ目の処理
$lock=start_lock4();
$lock_wait=start_lock();
fclose($lock_wait);
~処理~
fclose($lock);

//二つ目の処理
$lock=start_lock4();
$lock_wait=start_lock();
fclose($lock_wait);
~処理2~
fclose($lock);

//三つ目の処理
$lock=start_lock2();
$lock_wait=start_lock3();
fclose($lock_wait);
~処理3~
fclose($lock);

function start_lock()
{
	$lock = 'hoge.lock';

	if (!$fp=fopen($lock, "a")) die("can't lock");
	flock($fp, LOCK_EX);
	return $fp;
}
function start_lock2()
{
	$lock = 'hoge.lock';

	if (!$fp=fopen($lock, "a")) die("can't lock");
	flock($fp, LOCK_SH | LOCK_NB);
	return $fp;
}

function start_lock3()
{
	$lock = 'hoge2.lock';

	if (!$fp=fopen($lock, "a")) die("can't lock");
	flock($fp, LOCK_EX);
	return $fp;
}

function start_lock4()
{
	$lock = 'hoge2.lock';

	if (!$fp=fopen($lock, "a")) die("can't lock");
	flock($fp, LOCK_SH | LOCK_NB);
	return $fp;
}

一つ目と二つ目の処理をグループ化してみました。
う~ん。。。微妙ですね。。。w

  • このエントリーをはてなブックマークに追加
Related

PHP Laravel5.2でmulti-auth(複数テーブルでの認証)を実装

Laravel5.2でマルチ認証 概要 LaravelとはPHPの中で今最も伸びているフレームワークです。 処理速度が遅いなどありますが、かなり使い安く拡...

PHP 正規表現でIPアドレス形式の文字列か判定

正規表現でIPアドレスの入力チェック 概要 フォームで入力されたIPアドレスが正当な文字列か判定するためのバリデーション処理を実装します。 基本的...

rbenv環境でRuby on Railsのアプリケーションを一瞬で自動生成

アプリケーション構築時に最初に行う手順 概要 アプリケーションを作成するまでの手順を記載しています。 rbenvなどの環境が設定済と仮定して話を進めま...

Rails devise・authority・rolifyで権限付きの認証機能

devise・authority・rolify 概要 3つのGemを使用して、権限付き認証機能を実装します。 gem インストール Gemfile ...

Rails devise で複数モデルの認証機能を実装

Rails devise で複数モデルを管理 概要 rails のログイン認証 Gem「devise」のインストール・設定方法を紹介します。 よく「d...

jQuery UI ドラッグ&ドロップで並び替え sortableの使用方法

sortable 概要 jQuery UIを使用して、ドラッグ&ドロップで並び替えを行います。 sortableを使用することで、一瞬で実装できちゃいます...
トップへ戻る