CGIで稼動させる時にPathを自動取得する
開発・テスト機と本番機でユーザやディレクトリ構造が違う場合、設定値を書き直すのが面倒だったので、無い知識をフル活用。
DocumentRootの上位ディレクトリにアプリの実体ファイルを置くという設計。
/home/user/public_html/hoge.cgi /home/user/my_app/foo.pl
例えばhoge.cgiで$ENV{'DOCUMENT_ROOT'}を参照すると/home/user/public_htmlという値が返ってくる場合、DocumentRootのディレクトリ部分(ここでは「public_html」の部分)を削除してアプリ用のディレクトリを追記する方法をとる事に。
$ENV{'DOCUMENT_ROOT'}で取得可能な値を使って正規表現で加工。
$HOME = $ENV{'DOCUMENT_ROOT'}; $HOME =~ s/(\/(\w+))$//; # ホームディレクトリを抽出 $APP_HOME = $HOME . "/my_app"; # アプリのディレクトリを指定
でも、こんな事しなくてもFindBinモジュール*1を使えばもっと簡単に出来るんだそうです。
use FindBin; $APP_HOME = "$FindBin::Bin/../my_app";
参考:
モジュールに依存 (したくない | できない) 環境なら前者の方法も使い道があるかなw
というか相対と絶対の中庸みたいな/home/user/public_html/../my_appというパス指定が出来るということに今更ながら感動。ってことは自分が想定しているケースだったら
$APP_HOME = $ENV{'DOCUMENT_ROOT'} . "../my_app";
でOKってことじゃないですか。トホホ・・・正規表現もつかわず簡単。
*1:ちなみFindBinはperl5.003_07の頃からコアモジュールだそうで、幅広い環境で使えそうですね。