Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

This article is a Private article. Only a writer and users who know the URL can access it.
Please change open range to public in publish setting if you want to share this article with other users.

More than 5 years have passed since last update.

PHPでの排他制御

Posted at

はじめに

こんばんわじゃ〜。
以前書いたソースが先輩の手によって綺麗に生まれ変わっていたので、改善点を飲み込むためにメモ。(今日変化を見せていただきました。)
特に印象的だった排他制御の部分について記載します。

本題

タイトル通りPHPでのお話です。

結論

「ファイルの存在有無で処理を制御」ではなく「処理でファイルをロックする制御」の方が疎結合という感じ。
ファイルの存在有無はアプリによって判断されますが、それがいつどのプロセスによって作成されたかはわかりづらいです。プロセスが頓死すると次のプロセスが動けません。
ファイルがロックされていることはアプリ外からも確認できますし、常にプロセスに紐付きますから良いということですね。
と何を言っているのかよくわかりません。多分まだ飲み込みきれていません。今は反芻しています。

概要

重たい処理が並列で多重に実行されることを防ぎたかったので、
自分が作った時には、はじめに着手したプロセスで特定の名前のファイルを作成。別のプロセスが走る際に、そのファイルがあったら実行しない。という風に実装していました。
イメージでいうと下記のような感じですね。

try {
  if (isLock()) {
    throw new Exception();
  }

  if (!existLock()) {
    mkdir();
    touch();
    chmod();
  }

  //処理の実行
  execProccess();

  unlock();
} catch (Exception $e) {
  errorRendering($e->getMessage());
}

それが下記のように変わりました。

try {
  // ファイルハンドラを取得
  $fp = fopen('fileName','w');
  //ロックできなかったら処理を行わない
  if (!flock($fp, LOCK_EX | LOCK_NB)) {
    throw new Exception();
  }

  //処理の実行
  execProccess();

  fclose($fp);
} catch (Exception $e) {
  errorRendering($e->getMessage());
}

おわりに

自分一人でネットの海を漂い情報収拾することも有意義ですが、優秀な先輩の改修や改善、機能追加を見せてもらえるのはとてもわかりやすく刺激的ですね。
感謝。

0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?