6.30.2011

PHP めも - 静的変数 static

DBの情報を参照する function を生成するよう依頼され、よくある処理だけど今更勉強になったこと。

普通にテーブルにSELECT発行して返すものを作って性能テストやったら、1連の処理中での function へのアクセス頻度がかなり高い処理だったので、データベースサーバへの負荷が激しいということに。

「キャッシュ(メモ)化しましょう」と言われ、「あ、社内のフレームワークにそういうクラスがあるんだ」と思ったら「いえ、PHPの標準機能です」と説明されたw

何も説明されなかったら、global を用いるところだった。
正解は、static 変数を用いよ、とのこと。

function get_hanuman_1() {
  // 1. DB接続
  // 2. SELECT実行
  // 3. $hanuman = SELECT結果
  return $hanuman;
}

これを、次のように static を用い実装。

function get_hanuman_2() {
  static $hanuman;
  if ($hanuman === null) {
    // 1. DB接続
    // 2. SELECT実行
    // 3. $hanuman = SELECT結果
  }
  return $hanuman;
}

なんてことのない修正。DBアクセスの頻度やSELECTの激しさが大きければ大きいほど、処理速度と負荷軽減の効果が得られる。

ちなみに、自分がやろうとしていた global でも結果としては同じことができる。
static の記述が、global になるだけ。だが、

忘れっぽい自分みたいな人間には、全然関係の無い違う場所で global を同じ変数名で使ってしまい、しかも上書いてしまい、あたふたしてしまうので、当たり前だが変数を使用する領域を考えて正しい宣言をすることを意識して作業する。(このことすら忘れてしまうこともあるが)

あまり、理屈っぽくなるのも性に合わないから、迷わないために自分用ルール
global 設定値などをがっつり読み込んで、書き換わることが無い前提の変数で使う
static それ以外w

変数のスコープ

ちなみに、static 再帰性について、すこ~しだけ気になったので調べてみたら、
どんどん深みにはまっていった。こんなのすぐにまとめきれないので、キーワードだけ残して後日の課題。

自分自身への回答は:1回のHTTPリクエスト内で有効。
(今はこの理解だけでいい!)

勉強中にどんどん気になって深みにはまった内容は、
・スレッド

このあたり読み漁った。
[PHP-users 32346] スレッドとstatic変数の関係について
なぜ、 IIS は PHP アプリケーションの実行に不向きとされてきたのか?

0 件のコメント: