と、言うわけでMTをmod_perl2化を実現しようと、ソースをいじってみましたが、挫折しました。
mod_perl2を作ってる人は、なんでこんなにインターフェイスを大きく変えたんでしょうね~(泣)
一応途中までのやったことを書いておきます。
その前に参考URLは、mod_perl2のドキュメントのUser's guideの下のA Reference to mod_perl 1.0 to mod_perl 2.0 Migration. と言うドキュメントと、libapreq2のApache::Requestあたりです。
まず、httpd.confの設定ですが、
続いて、$MT/lib/MT/App.pmをmod_perl2に合わせて修正します。
mod_perl2を作ってる人は、なんでこんなにインターフェイスを大きく変えたんでしょうね~(泣)
一応途中までのやったことを書いておきます。
その前に参考URLは、mod_perl2のドキュメントのUser's guideの下のA Reference to mod_perl 1.0 to mod_perl 2.0 Migration. と言うドキュメントと、libapreq2のApache::Requestあたりです。
まず、httpd.confの設定ですが、
PerlSwitches -I/var/www/docs/cgi-bin/mt/lib -I/var/www/docs/cgi-bin/mt/extlib PerlModule Apache2 PerlModule ModPerl::Registry PerlModule Apache::DBI <Directory "/var/www/docs/cgi-bin/mt"> SetHandler perl-script PerlResponseHandler ModPerl::Registry Options +ExecCGI PerlOptions -ParseHeaders </Directory>みたいな感じです。
- 環境変数PERL5LIBの変わりに、PerlSwitches -Iを使います。
- PerlModule Apache2を追加します。
- Apache::Registryの変わりに、ModPerl::Registryを使います。
- PerlHandlerの変わりに、PerlResponseHandlerを使います。
- PerlSendHeader Offの変わりに、PerlOptions -ParseHeadersを使います。
chdir("/var/www/docs/cgi-bin/mt/");# 上の例では、/var/www/docs/cgi-bin/mt にMTがインストールされています。
続いて、$MT/lib/MT/App.pmをmod_perl2に合わせて修正します。
- 63行目付近
$app->{apache}->send_http_header($type);
を$app->{apache}->content_type($type);
に変更。 - 183行目付近
$class->fetch;
を$class->fetch($app->{apache});
に変更。 - 283行目付近
$app->{apache}->status(Apache::Constants::REDIRECT());
をuse Apache::Const -compile => qw(:common); $app->{apache}->status(Apache::REDIRECT);
に変更。 - 353行目付近
my $tab = $q->parms;
をmy $tab = $q->param;
に変更。
- 209行目付近
my $status = $q->parse; unless ($status == Apache::Constants::OK()) {
ここで、$qはApache::Requestだと思うのですが、parseなんてAPIリファレンスに載ってません。リファレンスを読んだ感じだと、statusを呼べば良さそうなんですが、呼ぶとmod_perlが落ちてしまいます。
さらに、Apache::Constants::OKもmod_perl2にはないので、ここも変える必要があります。 - 445行目付近
$ENV{MOD_PERL} ? $app->{apache}->connection->remote_ip : $ENV{REMOTE_ADDR};
を$ENV{MOD_PERL} ? $app->{apache}->connection->remote_addr->ip_get : $ENV{REMOTE_ADDR};
に変更してみたのですが、Apache::Connectionのremote_addrなんて知らないよう!と言われてしまいます。 - MT/lib/App/Comments.pm 30行目付近
An error occurred: Usage: $table->get($key) at lib/MT/App/Comments.pm line 32.
と言うエラーが出ました。APIリファレンスによると、$q->paramは引数が1個のバージョンしか載っていないようで、設定の方法がわかりません。
とりあえず、$q->param('__mode', 'post');
を$q->param->set('__mode', 'post');
のように変更して見ましたが、コメントのポスト画面が再度表示されるだけで、うまく動かないようです。
カテゴリ
MovableTypeトラックバック(5)
このブログ記事を参照しているブログ一覧: MTのmod_perl2化
このブログ記事に対するトラックバックURL: https://www.wizard-limit.net/cgi-bin/mt/mt-tb.cgi/688
» Fedora core2へのmod_perl導入(一語/一区)~のトラックバック
処理が数倍早くなるという触れ込みのmod_perlを導入してみた。... 続きを読む
» MT の Apache2 + mod_perl2 化、成功?(ダメ出し日記)~のトラックバック
» MT4MP2 (MTモジュール)(der Mu[:]llkasten)~のトラックバック
テンプレートを弄ってて思ったのですが、画面切り替え時のもっさり動作がやはり気にな... 続きを読む
» MT の Apache2 + mod_perl2 化、成功?(ダメ出し日記)~のトラックバック
» MT の Apache2 + mod_perl2 化、成功?(ダメ出し日記)~のトラックバック
PerlModule Apache::compat
したらどうでしょうか?
compat.pm の中に、remote_addr というメソッドがあるようです。
コメントありがとうございます。
Apache::compatも試したと思うのですが、うまく行かなかったようです。
そもそも、APIリファレンスを読み直してみたら、remote_addrもremote_ipも載ってるんですよね~。
現在、2箇所で修正しつつテストを行っているのですが、片方ではremote_xxx関係ではエラーが出ていなかったりして・・・(汗)
remote_ipについてはわかりました。
httpd.confに、PerlModule Apache::portingを追加すると、mod_perl1からの変更点を指摘してくれるようになるのですが、それによると use Apache::Connection;を追加しろと出るので、追加したらその部分は通るようになりました。
しかし、$q->param(p1, p2)の部分は教えてくれません・・・。
こっちの方はmod_perl2ではなくて、libapreq2の方なので、portingは効かない模様。さらに、インストールされているのはlibapreq2-2.03で、読んでいたドキュメントはlibapreq2-2.04でした。
2.04では、移植の注意点として、paramに設定する場合にはこうしろってことが書いてあるのですが、2.03のドキュメントではsetはTODOとか書いてありました・・・。
set は mod_perl2 と libapreq2 を cvs 版にすると使えるようになるとおもいます。
libapreq2 の cvs版は mod_perl2 のcvs版(1.99_15)に依存してるので注意です。
コメントありがとうございます。
cvs版にするのは、ちょっと面倒なのでもう少し待ってみることにします。
>mod_perl2では、スクリプトが実行されるディレクトリがスクリプトのディレクトリではなくなってしまったので、$MT/*.cgiの先頭に以下を追加します。
めんどくさいので作ってみました。
テスト環境がすくないので十分検証できてませんが
よかったらつかってみてください。
使用例:
PerlModule Apache::compat
PerlSwitches -wT
SetHandler perl-script
PerlHandler Apache2::chdir ModPerl::Registry
PerlOptions -ParseHeaders +GlobalRequest