ArkをCGIで動かすスクリプト(2)

| コメント(0)

前回の続きです。

どうも、のほほんとWin32 + Strawberry Perl環境で試した所為か、前回のスクリプトでアクションキャッシュが初回生成出来ない場合があることに気が付きました。

また、/css/*.cssなどのファイルを読めていないことも気が付きました。

さらに、$c->uri_forの問題もまだ追えていません。

なんだかもうちょっとArkの中身を見る必要がありそうですが、ともあれ、CGIで試すときの気をつける点などを合わせてどうぞ。

最初に模範解答を:Arc Document Browser

そもそも、よくサンプルアプリケーションのArk Document Browserを見てみると、ちゃんと/script/arkdoc.cgiにCGI版スクリプトがありました。なので基本的にはその通りではあるのですが、いくつか気をつける点もあります。

アクションキャッシュを作れない

症状

Win32環境だからかそれとも私の環境がおかしいからなのか、アプリケーションルートに作られるアクションキャッシュファイル(/action.cache)を作れずに死ぬという、怪しげな問題があります。

というのも、一旦アクションキャッシュを消してCGI実行すると、$app->setup_minimal内で読んでいる、アクションキャッシュを作るメソッドArk::Core::setup_storeで、Storable::storeの書き込みに失敗してしまうのです。

Apacheの稼働ユーザーがアプリケーションルートディレクトリにキャッシュファイルaction.cacheを書き込む権限がないと当然のことながら死にますが、適切に権限を与えても、以下のようなエラーが出ます。

Can't store CODE items at blib\lib\Storable.pm (autosplit into blib\lib\auto\Storable\_store.al) line 264, at D:/strawberry/perl/site/lib/Ark/Core.pm line 266

余談ですが、Arkのデフォルトログ出力先は標準エラー出力なので、分からなかったら素直にevalで括るかコマンドラインで直接perl ./bin/amikeco_cgi.plするのが良いでしょう。

環境についてもうちょっとちゃんと記すと、

それと、use Any::Moose;Mooseが呼ばれないことを確認しているので不要とは思いますが、念のため掲げると

  • Class::MOP 0.84
  • Moose 0.79

という環境です。

取り敢えずの暫定回避策

閑話休題、悪いのはこちらの環境なのだろうと思うのですが、一番最初にsetup_minimalを動かしたのがCGIスクリプトでないというケチも付けられるので、何が悪いのかすぐには追えません。ということで、エラーメッセージに従ってStorableのドキュメントを読んで、以下のように回避しました。

{
    no warnings 'once';
    local $Storable::Deparse = 1; # Storable対策
    $app->setup_minimal;
}

です。

静的ファイルを読めていない

$mw->install('HTTP::Engine::Middleware::Static' => {
    docroot => $app->path_to('root'),
    regexp => '/(?:(?:css|js|img|images?|swf|static|tmp|)/.*|[^/]+\.[^/]+)',
});

などとして静的ファイルを指定しています。Ark内部で処理可能な/root/*.mtなどのテンプレートファイルは問題なく読めていますが、一旦ページを作成した後、ユーザーエージェントから(Apacheを介して)読みに行く/root/css/*.cssなどのファイルが読めないという問題が分かりました。

これは$c->uri_for('/css/foobar.css')としたときに/bin/amikeco_cgi.bin/css/foobar.cssを返すのが直接の理由なので、$c->uri_for問題が解決すれば自動的に解決するとは思う......と書いていて気が付きましたが、httpd.confなり.htaccessの指定と衝突してもいました。うっかりぽん。

    ....
    RewriteEngine On
    # RewriteCond %{REQUEST_URI} !^/?bin/amikeco_cgi.pl
    RewriteCond %{REQUEST_URI} !^/?(bin/amikeco_cgi.pl|css/|js/) # and so on
    RewriteRule ^(.*)$ /bin/amikeco_cgi.pl/$1 [PT,L]
    ....

などとして、Arkに食われないようにしておく必要がありますね。

$c->uri_forについては、Win32が悪いのか、私の環境やが悪いのか、私の使い方がそもそも間違っているのか、もうちょっと調べてみようと思います。症状とエラーメッセージから類推して、Cwd関係のFile::Spec::Win32辺りに原因があるような気がしています。

その他

模範解答との差異はまだあります。

use FindBin::lib instead of FindBin

FindBin::libは、標準モジュールではありませんが、

use FindBin;
use lib $FindBin::RealBin . '../lib'; # /bin/myapp_cgi.plに対する/lib/を指定

use FindBin::lib; # 上に同じ

と書けます。この方が移植性に優れているので、FindBin:libをCPANからインストール出来る環境なら(そもそもArkをインストール出来る環境なら、当然出来るはずですが)、こちらを試した方が良かったですね。

HTTP::Middleware::Staticの要否

Ark Document Browserによると、ServerSimpe(組み込みサーバー)とCGIで、HTTP::Middlewareの使用に差異があります。間違いなくArk Document Browserの方が正しいので、上記の静的ファイルが読めない問題と合わせて、最適解を調べてみることにします。

全体を通して......use UNIX instead of Win32

まあ、Win32環境で試すのが悪いのは明白で、素直にUNIX系環境で試せよ、という話ですね。

取り敢えず気軽に試せるように(VMWare or VirtualPC) + (Ubuntu or Debian)辺りの環境を、普段使いの環境に用意しておくことにします。

コメントする

筆者"Gardejo"について

  • Twitter: @gardejo
  • GitHub: gardejo
  • CodeRepos: gardejo
  • CPAN: MORIYA

このサイトについて

Eorzea System Worksは、架空のシステム開発結社です。

FF14.name (FinalFantasyXIV.name)では、アヴァター(プレイヤーキャラクター)の管理システムやイベント出欠・リマインダシステムや、リンクシェル(LS)運営・管理システムやDKPシステムなどを設計・開発・公開する予定です。

関連サイト

関連サイトでは、他にもFF14に関連するサイトをいくつか紹介しています。

リンク, トラックバック歓迎

このブログへのリンク(どのページでも構いません)やトラックバックを歓迎します。

設計・開発・運用の参考にさせていただきますので、コメントもお気軽にお寄せください!

個別の記事に対するご意見などのほか、目安箱もご用意しています。

このブログ記事について

このページは、Gardejoが2009年6月29日 22:38に書いたブログ記事です。

ひとつ前のブログ記事は「ディスク容量超過の恐怖」です。

次のブログ記事は「テンプレートの継承に首っ丈」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

2014年2月

            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28  

やや真面目なサイト