[僕] 2005年09月07日 アーカイブ

僕ト云フ事

たろマークはてなブックマーク

2005年09月07日

[apache][cgi-app][mod_perl] CGI::Application::Dispatch を mod_perl 下で動かした時に warning が出た

タイトル長え('A`)
apache/mod_perl 2系には関係なさげ。

  • apache 1.3.33
  • mod_perl 1.29
  • perl 5.8.0
  • CGI::Application::Dispatch 1.04

で、PerlHandler に Apache::Registry 使った環境で動かしたら、error log に以下のような warning が出た。

Dispatch.pm: Use of uninitialized value in numeric eq (==) at /usr/lib/perl5/site_perl/5.8.0/CGI/Application/Dispatch.pm line 12.

httpd.conf に下記の行を設定して回避。

PerlSetEnv MOD_PERL_API_VERSION 1

設定する値は2以外だったらなんでもいいんだと思うけど。
そもそも、PerlHandler に CGI::Application::Dispatch 使えって話かもしれませんが、ちょっと自分の書いたスクリプトに問題があったので。

やっぱり、相対指定は上手く外していこう(←ダメだった部分

ちなみに、CGI::Application::Dispatch の patch 作ってみた。

*** Dispatch.pm.org	2005-09-07 20:11:13.000000000 +0900
--- Dispatch.pm	2005-09-07 20:13:32.000000000 +0900
***************
*** 9,15 ****
  
  BEGIN {
      if( $ENV{MOD_PERL} ) {
!         $MP2 = $ENV{MOD_PERL_API_VERSION} == 2;
          if( $MP2 ) {
              require Apache2::Const;
              require Apache2::RequestUtil;
--- 9,15 ----
  
  BEGIN {
      if( $ENV{MOD_PERL} ) {
!         if ( exists $ENV{MOD_PERL_API_VERSION} ) { $MP2 = ( $ENV{MOD_PERL_API_VERSION} == 2 ) }
          if( $MP2 ) {
              require Apache2::Const;
              require Apache2::RequestUtil;

まだ、mod_perl に慣れてないというか知識不足があるんだけども、mod_perl 1 系では、$ENV{MOD_PERL_API_VERSION} がセットされないっぽい。

[cgi][cgi-app][path] ディレクトリ構成とか

CGI::Application 関係で見つけたおまえさんの blog。よく参考にさせてもらってます。(自分のコメントがきっかけでエントリ一つ起こしてもらったにもかかわらず反応できなくてすいません orz)んで、

CGI::Application::Dispatch勉強中その2 : おまえのログ

どこかに、こういうディレクトリ構成のガイドとか、絶対パス・相対パスどっちできじゅつするのがよいかHowToみたいのはなかろうか…。うろうろ。

迷いますねー。迷ってました。でも僕は、SSI とかで、HTML の部品となる テキストファイルを include させることが好きで、そういう場合、部品側を相対パスで書いておくと呼び出し元によっては狂うので、最近は絶対パスばっかりです。

<a href="/foo/bar">hogehoge</a>

こんな感じです。画像の参照先なんかもそうです。

<img src="/img/hogehoge.jpg">

ちなみに、CGI::Application を使う以前から、テンプレートをまとめることをよくしてたのであまり気になってません('-';)
最近の自分の作るもののディレクトリ階層はこんな感じ、と晒してみる。

  • /home/taro
    • conf/
    • lib/
    • tmpl/
    • public_html/
      • app.cgi
      • img/
        • app/
      • css/
      • js/
      • ssi/
      • category/
        • img/

こんな感じで、テンプレートファイル群は、tmpl ディレクトリ以下にまとめてます。
conf が設定ファイル系(データベースのパスワードとか)、lib が MyApp なモジュール置く場所です。

あー、インスタンス CGI な app.cgi は、

use lib qw (../lib);

って、相対指定してます(;'-')
というか、スクリプトの中身は相対指定が多いかも orz
#テンプレの在り処とか、設定ファイルの場所とか。

このあたりが上手く処理できたら、MyApp なモジュールを Path が通ってるところにインストールしちまえとか考えてるんですけどねぇ。

というか、html 内の参照指定な話と perl スクリプト内の参照指定な話がごっちゃになってわかりづらいエントリに。スンマセン orz

他の人のディレクトリも見てみたいですねー。

ちなみにこの blog があるディレクトリ階層はめちゃくちゃです。カオスw
整理せねばなー。