2012/10/04

Apache2::Data::Section::Simple - Data::Section::Simple for ModPerl::Registry

THIS MODULE IS BETA. YOU SHOULD NOT USE

動機

ModPerl::Registryでは__DATA__を読み込むことができないのは周知の事実かと思います.
なんかよくわかりませんが,twitterのtimelineで__DATA__を読むことができないかと盛り上がってる感じがしたので,チャレンジしてみました.

HOW TO USE

Data::Section::Simpleと同じです

URL

p5-apache2-data-section-simple

動作環境

動作確認をしたのは以下の環境です

  • FreeBSD 8.1-RELEASE
  • Apache/2.2.17 (FreeBSD)
  • mod_perl2.0.5
  • perl v5.10.1

2 件のコメント:

  1. mod_perl1の場合は__END__と__DATA__の各トークンは、対象スクリプト中に存在すらしていてはいけません。アクセスされてApache::Registryのコンパイルが走った時点でエラーになります。理由は、virutalhostとuriから生成したパッケージ名を作って、そのスクリプトがそのパッケージの sub handler { ... } 内にあるかのようなコードを生成して文字列evalを行うからです。Apache::Registryのドキュメントには、スクリプトには__END__と__DATA__を含めてはいけない、と書かれています。Apache::PerlRunも同様です。

    mod_perl2の場合も高速化の手法は同様ですが、mod_perl1のようにエラーになることを回避するために、__END__と__DATA__の各トークンは、対象スクリプトのコンパイル時に取り除かれるようになりました。Registryファミリーの親クラスであるModPerl::RegistryCookerのstrip_end_data_segmentメソッドがそれを行っています。なので、エラーにはなりませんが、コンパイルされたスクリプト内で普通にDATAファイルハンドルからデータを読み出そうとしても徒労に終わります。

    返信削除
    返信
    1. mod_perl1だとそんな動作なんですね。2系しか使ったことがないので知りませんでした。後で対応しようと思ってましたが、それだと無理そうですね。

      > 対象スクリプトのコンパイル時に取り除かれるようになりました
      最初はなんとかDATA handlerから読もうとしましたが、Tetsujiさんも言っているように、この挙動があるので、結局自分自身をファイルとして開いて__DATA__以下を引っ張ってくるかたちで実装しました。

      削除