読者です 読者をやめる 読者になる 読者になる

hidefを試す

PHP

一流のペチパーとやらにもなれば、「PHPのdefineはコストが高いからねー」とドヤ顔で語りつつ hidef なるものを使うらしい。

しかし、"PHP hidef"とかでググっても、インストールの仕方とかごく基本的なことはともかく、hidefを使ったアプリケーション設計とか、ラッパーライブラリとか(hidef単体で使うのはキツい)、運用のベスト・プラクティス的な記事は全然出てこない感じがするのだが、本当に一流のペチパーとやらは呼吸するかのごとくhidefを使いこなしているのだろうか?

インストール

hidefパッケージを提供しているディストリビューションはあまりないように見えるので、一番無難な方法、peclでインストールする。

 $ sudo pecl install hidef

RHEL系の場合、

 $ sudo yum install php-pear php-devel pcre-devel

等のパッケージが必要かもしれない。pecl install後、/etc/php.d/hidef.ini に、

extension=hidef.so
hidef.ini_path=/apps/myapp/current/hidef/
hidef.data_path=/apps/myapp/current/hidef/

のような定義を追加する。

/apps/myapp/current/hidef/ はCapistranoでアプリケーションをデプロイするならばこんな感じになるんじゃないかな、と考えたパス。単にhidefを試してみたいだけならば、/tmp/hidef とかでも良い。

iniファイルからdefineを定義する

hidef.ini_path で定義したディレクトリに、

 str HELLOWORLD = "Hello World";

のようなファイルを拡張子.ini (例えば sample.ini など)で作る。その上で、

 $ php -r "var_dump(HELLOWORLD);"

のようにphpを実行すると、

 string(11) "Hello World"

のように出力される。

HELLOWORLDという定数がphpスクリプトの中ではどこにも定義されていないのに動作しているのは、hidef拡張が hidef.ini_path で定義したディレクトリ内の.iniファイルに基づいて define に相当する処理を行なってくれるかららしい。

dataファイルから定数を定義する

<?php
$data = array(
  "spam" => 1,
  "egg" => 2,
  "ham" => 3,
);

$outputDir = ini_get("hidef.data_path");
file_put_contents("${outputDir}/test.data", serialize($data));

のようなスクリプトを使い、hidef.data_path で定義したディレクトリにPHP serializeしたデータを test.data という拡張子で保存する。

その上で、

$  php -r "var_dump(hidef_fetch('test'));"

のように hidef_fetch 関数を使うと、呼び出し側のPHPスクリプトでは、やはりどこにもtestというデータを定義していないのにもかかわらず、

object(FrozenArray)#1 (3) {
  ["spam"]=>
  int(1)
  ["egg"]=>
  int(2)
  ["ham"]=>
  int(3)
}

のような データを取得できる。

どんな用途に使うべきか

.ini や .data で定義したデータは不可変で、Apache上でPHPを実行している場合にはApacheを再起動しないと .ini や .data に加えた変更は反映されない(らしい)。

毎回Apacheを再起動していては開発時はつらいので、開発中は通常の define や array を使って設定を動的に読み込むようにしておき、アプリケーションをデプロイするタイミングで、hidef が期待する .ini や .data のフォーマットにデータを変換するような仕組みが必要であろう。

どんな用途に hidef を使うべきかに関しては、hidef の README を読むと、次のように、「多言語化の言語データテーブルみたいなものに使うのが理想的」と言っている。

Something like a localization table would be ideal to store in this cache. Since no updates are possible in hidef without restarting apache, data with a short life-span obviously doesn't belong in this.

ここに書いてある通り、生存期間が短いデータは hidef には向かないし、あるいは、ごく少ない設定データやごく少数の定数では有意な効果はでないかもしれない。