設定ファイルに絶対パスを書くのを避けたい
アプリの置いてあるパスを絶対パスで取得したい。
楽なのはconfにPerlSetEnvで書いてプログラムで$ENV{APP_PATH}とかで受け取ればいいけど、confに絶対パス書くのを避けたい。
案1:File::Spec->rel2absを使ってみる
大抵のwafで作ったアプリは起動時に1回だけ走る処理がある。Catalystのsetupみたいな。
そこで絶対パスを取得してはどうか。
$APP_PATH = File::Spec->rel2abs('..');
DocumentRootに指定したパスの1個上がアプリホームだと仮定するとこうなる。
アプリパス:/hoge/app
DocumentRoot:/hoge/app/htdocs
的な。
一見正しく動いてくれるけど、しばらくすると確実にエラーる。
理由は、子プロセスは大抵複数あるけど、その子プロセスそれぞれにおいて「起動時に1回だけ走る処理」が走るから。
例えば、子プロセス1に http://example.com/ でアクセスしたら $APP_PATH は /hoge/app/htdocs/.. になるが、
子プロセス2が生まれた後、初めてのアクセスが http://example.com/user/ だったら、 $APP_PATH は /hoge/app/htdocs/user/.. になる。
いやーハマったハマった。
httpd -X とかするとシングルプロセスで走るけど、デバッグ用だし重いのでだめぽ
というのを柔道家から教えてもらった。
案2:先にconfにモジュール読み込む命令書く
LoadModuleか何かで、起動時に「このファイル先に読め」的なことができるらしい。これも柔道家から教えてもらった。
が。
アプリ内で使うモジュール全部書くんですと。アプリ本体はもちろん、DBIx::ClassからTemplateまで。他も全部。
そうしないとメモリ効率が悪くなるんだそうで。
ごめんなさい逃げさせてください。