トップページ⇒php
1001コメント343KB

mod_perlを使おう!

■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん01/11/07 17:42ID:+Gux2iOQ
CGIを激速で実行できるmod_perlについて語りませう。
関連リンク等は>2
0348nobodyさん04/03/15 14:56ID:???
>>347
cgiがおかしいかmod_perlに対応してないものを使ってるんだろ。
作者に問い合わせるんだな。
0349nobodyさん04/03/15 22:07ID:???
>>347
珍しいエラーだなあ。

ちなみに何をやろうとしてそういう状態になったんだ?
Apache::Registry? Apache::PerlRun?
それとも Movable Type だか AxKit だかを PerlHandler で組み込んだ?
0350mod_perlはじめて君04/03/23 13:29ID:3jX1Q8fV
mod_perlってブラウザから起動するcgiファイルにはpackage名つけちゃまずいのでしょうか?
packageつけるとSubroutine check redefinedとゆうwarningsが沢山出ちゃうんです。
でもpackage消しても
Prototype mismatch: sub Apache::ROOT::sakura::cgi_2dbin::test::test_2ecgi::check vs ()
というwarningsが出てしまうんですが、これってmod_perlの仕様なんでしょうか?
warningsが出るのが気になるタイプの人なんです僕o(_ _)o
0351ログ補完04/03/29 13:16ID:???
351 名前: nobodyさん :sage 投稿日: 04/03/25 (木) 17:44 ID:???
もしかしてApache::Registryだとopen FH, >hoge.dat でファイルを作ってくれなくなった?
0352nobodyさん04/03/30 14:23ID:???
my変数はブロック抜けたらちゃんと開放されるそうですが、
my $foo = { hoge => 'hoge' };
だと$fooの値は消えても無名ハッシュ内の値は消えないとか
そう言う事は無いですか。
0353nobodyさん04/03/30 14:39ID:???
>>352
http://www.kt.rim.or.jp/%7ekbk/perl5.005/perlref.html
http://pc5.2ch.net/test/read.cgi/php/1078076768/
0354nobodyさん04/03/30 14:59ID:???
>353
CGI等で使うと終了時に全クリアされるようですが
mod_perl(Regstry)では値がキャッシュされると聞いたのでこちらで聞きました。

要は、リファレンスが変数に格納されていると、
変数が消えた瞬間に値の内容もきちんと消されると言う事ですね。
0355nobodyさん04/03/30 15:00ID:???
>354
×値
○参照されている値
#少し語弊があるので修正
0356nobodyさん04/04/02 13:16ID:???
mod_perlのmodってモッドって読めば良いのですか。
0357nobodyさん04/04/08 09:32ID:???
モード・パールでは
0358Perlさん04/04/08 13:57ID:???
module_perl
0359nobodyさん04/04/10 01:10ID:???
おれは勝手にモドパールと呼んでる。

世間的にどうなのかは知らない。
0360nobodyさん04/04/10 12:24ID:???
モゥデュパァァァッル
0361nobodyさん04/04/30 13:24ID:???
$self のような mod_perl 自身のグローバル変数に値を追加するのは止めておいた方が良いですか?
一応、local $self->{'HOGE'} = 'hoge'; とかやっているのですが。
0362nobodyさん04/05/01 09:28ID:???
>>361
その書き方だと $self はリファレンスだから、local する意味はない。

ってか、$self の位置づけがいまいちわからん。
mod_perl で呼び出すスクリプトで使ってるオブジェクトのリファレンス?
0363nobodyさん04/05/01 13:35ID:???
すみません、そういわれて調べたところ
起動時に PerlRequire で読み込んでいる Apache2 モジュールの機能でした。
てっきり mod_perl を使うと %$self が勝手に用意されるのかと。

local は意味が無かったのですね……。
036436204/05/01 20:23ID:???
>>363
具体的にどんなことをしたいんだ?
0365nobodyさん04/05/02 00:24ID:???
いえ、元々は単にファイルを置いてあるディレクトリを
$self->{'FILEDIR'} (このキーは初めは用意されていない)に入れたいと思っただけなのですが、
そこで mod_perl でこういう予め決まったキーや値が入っている変数に勝手に追加して良いのかどうか、
不安だったのです。
どこかに何か影響が出たりするのだろうかと。
036636204/05/02 03:46ID:???
>>365
現段階でそのキーが使われていなければ使える。
が、将来的にもそのキーが使われない保証はない。

スクリプトをオブジェクト指向で書いているなら、そのオブジェクトに入れるべき。
書いていなければそう書き直しましょう。
0367nobodyさん04/06/14 00:54ID:UCF4wTWN
Aapche2.0.49 mod_perl_1.99_13 + perl5.8.3 + Apache::DBI + MySQL
の構成で、lock tableした後に
どこかのSQL実行に失敗してerrstrで処理するとunlockできないのだが、
何とかならないのだろうか。

識者の見解キボン。

失敗しなきゃ良いというのは無しでお願い。
0368nobodyさん04/06/23 16:45ID:???
perlccでバイナイリコードにしたスクリプトをmod_perlにて実行することは出来ないでしょうか?
# perlcc -B test2.cgi.org -o test2.cgi
*インタプリタは内蔵せずスクリプトをバイトコードに変換するだけ(たぶん)

test2.cgi.orgの内容
#!/usr/bin/perl
print "Content-type:text/plain\n\n";
print "Hello world!!\n";

@ # ./test2.cgi の結果
Hello world!!

@ mod_perlを無効にしWEBからアクセスした結果
Hello world!!

@ mod_perlを有効にしWEBからアクセスした結果
Missing right curly or square bracket at /home/hoge/public_html/mod_perl/test2.cgi line 3, at end of line
syntax error at /home/hoge/public_html/mod_perl/test2.cgi line 3, at EOF

その時のerror_log

[Wed Jun 23 16:27:32 2004] [error] 6945: ModPerl::Registry:
Missing right curly or square bracket at /home/hoge/public_html/mod_perl/test2.cgi line 3, at end of line
syntax error at /home/hoge/public_html/mod_perl/test2.cgi line 3, at EOF

環境:Fedora core1、apache 2.0.48-1.2、perl 5.8.3、mod_perl 1.99_12-2
RH7.3、apache 1.3.27-4、perl 5.6.1、mod_perl 1.26-5 でも似たような結果でした

やりたいことはPerlで高速な動作をしつつ、ある程度のソースの隠蔽をしたいのですが
perlcc+mod_perlで動かす方法、もしくはそれに変わる代替手段がございましたら
ご教授くださいませオマイら。
0369nobodyさん04/06/23 19:49ID:???
よ〜くかんがえよぉ〜
0370nobodyさん04/06/23 20:32ID:???
世の中的には mod_perl って
「原理はわかんないがとにかく CGI が高速になる魔法の箱」
と思われているのものなのだな
0371nobodyさん04/06/23 20:39ID:???
だってだってだって だって厨なんだもん
0372nobodyさん04/06/23 20:39ID:???
お願いお願い 笑わせないで
0373nobodyさん04/06/23 22:44ID:GOWHNOao
>>371-372
オサーンハッケソ!
037436804/06/24 14:47ID:???
Apache::Registryは高次元でPerlのエミュレートをしており、通常のCGI/Perlと同様に
mod_perlもバイトコードへの変換プロセスを踏むと私は何の根拠もなく推測しており
mod_perl側で通常のソースとバイトコードを判別し適切なステップを踏むように作られていれば
perlccでコンパイルしたスクリプトが動作しても理論上不思議ではないと
思うのですがどうでしょうか。

この場合、ごく単純なスクリプトでも動作しないので
mod_perl側でperlccを考慮した機構がないんだとは思いますが。
0375nobodyさん04/06/24 19:55ID:???
mod_perl は、多くの人が勝手に想像しているイメージとは異なり、
「CGIを高速に実行する環境」ではありません。
「apache モジュールの一つで、perl インタプリタを内蔵しており、
 apache API の操作手順を perl スクリプトとして外部に切り出すことのできるもの」
などとするべきでしょう。

この違いはたいへん重要です。なぜなら mod_perl それ自体には
「CGIのプログラムファイルをロードする機構は含まれていない」からです。
mod_perl に用意されたロード機能は、apache 起動時に、
httpd.conf で指定された perl スクリプト(クラスモジュール)を読み込むこと、
だけです。CGI プログラムファイルを直接読み込むことはできません。

CGIを実行するためには当然プログラムファイルをロードしなければならず、
そのためにはローダとなる機構が別途必要です。
このために Apache::Registry という perl クラスモジュールが
mod_perl と同梱して配布されています。
httpd で Apache::Registry を指定しておくと、apache 起動時にこれが読み込まれ、
以後 CGI のローダとして動きます。

この Apache::Registry の機能は、スクリプトファイルを読み込み、
これを CGI をエミュレートした環境下で eval することです。
ところが、perlcc でコンパイルされたバイトコードは use ByteLoader されています。
この ByteLoader のようなソースフィルタが、eval と相性最悪なのです。
そのため、Apache::Registry の方法では、バイトコードを実行できません。

Apache::Registry とは異なる原理に基づくローダを自作すれば、
理論的には不可能な話でも無いと考えられます。
037636804/06/26 05:51ID:???
>>375
大変勉強になりました。
何か別の方法を模索してみようと思います。ありがとうございました。
0377nobodyさん04/08/02 18:48ID:???
mod_perl って、Cで書いたCGIより速いんだね。

まぁ、メモリ上にキャッシュするから当然っちゃー当然だがね。
0378nobodyさん04/08/02 22:15ID:???
いやケースバイケースで、CのCGIの方が速いケースもあるけど

しかしまあこの板の住人が使うケースの99%は mod_perl の方が速いだろうな

ちなみに、apache の module を C で書いて組み込んでしまえば
mod_perl よりさらに速い
0379nobodyさん04/08/17 15:02ID:fsY5EgQV
mod_perlを初めて使います。
DBアクセスで、cgiだと動作するのですが、mod_perlだと動作しません。
ソースは以下です。いろいろなサンプルでは、cgiの場合と、mod_perlの
場合に違いが感じられないので、設定、もしくはユーザー権限のようなもの
かなと想像しているのですが。
ご教授頂けませんでしょうか。

#!/usr/local/bin/perl -w
use strict;

print("Content-Type: text/plain\r\n\r\n");

my($dbh,$sql,$sth,$res);
use DBI;
my $key = '1234';
#############
my $dbh = DBI->connect("DBI:mysql:test","test","pas");
$sql = "SELECT * from TBL where key =".$dbh->quote($key);
$sth = $dbh->prepare($sql);
$res = $sth->execute;
$sth->finish;
$dbh->disconnect;
#############
print "res=";
print $res;

0380nobodyさん04/08/17 15:07ID:???
CGIだと動作するの? ふんとに?
0381nobodyさん04/08/17 15:17ID:???
画像の合成とかはCの方が速いね。
0382nobodyさん04/08/17 15:18ID:???
「動作しません」じゃなくて、
どういう風に動作しないのか、
エラーを吐くのか、それとも期待と違う動作なのか、
とかその辺を報告しろと
0383DB04/08/17 15:28ID:fsY5EgQV
ブラウザ上では、「サーバーが見つかりません」となります。
cgi(普通のPerl)では動作します。
0384nobodyさん04/08/17 15:29ID:???
( ゚д゚)ハァ?
0385DB04/08/17 15:50ID:fsY5EgQV
ちなみに、 ############# から ############# をコメントアウトすると
動作します。
cgi として動作させれば、$res の値も正常に表示されます。
0386nobodyさん04/08/17 16:25ID:???
DBの設定が悪い。perlをsshでログインしてサーバ上で動かしてるなら
多分あんたの環境じゃsu_execじゃないと動かない。
以上。
0387DB04/08/17 16:51ID:fsY5EgQV
DBですね。何を調べてよいのか分からなかったので、助かります。
有難う御座いました。
0388nobodyさん04/08/17 16:54ID:???
コメントアウトしたら、本当に動くのか?
print("Content-Type: text/plain\r\n\r\n");
のヘッダーでmod_perlって動いたっけ?
事前に200OKを吐く必要があったと記憶しているが・・・・

誰も指摘しないのはなぜだろうか・・・
0389nobodyさん04/08/17 16:57ID:???
>>383
お前は誰よ?
0390nobodyさん04/08/17 17:57ID:???
>>388
PerlSendHeader
0391DB04/08/18 19:13ID:+YCQrBn3
>>389
379を書いた者です。
>>388
httpd.conf の中で
PerlSendHeader On
とすれば良いらしいのですか、Apache に詳しくないので・・・。

httpd.conf の中で、それらしい設定は
AddModule mod_perl.c

<IfModule mod_perl.c>
<Files *.xpl>
SetHandler perl-script
PerlHandler Apache::Registry
PerlSendHeader On
Options ExecCGI
</Files>
</IfModule>

としています。
拡張子 .cgi が通常のcgi
拡張子 .xpl がmod_perl で動く設定です。
0392nobodyさん04/09/30 21:13:33ID:???
初心者的質問で悪いですが、解説サイトみても分からなかったので・・・。
Apache2でDSOとしてmod_perlを読み込む場合のhttpd.confの記述はどのように
すればよろしいでしょうか?
0393nobodyさん04/09/30 22:43:45ID:???
>>392
http://perl.apache.org/docs/2.0/user/config/config.html#Enabling_mod_perl
0394nobodyさん04/10/01 00:12:20ID:???
fastCGIのスレどこよ?
0395nobodyさん04/11/21 21:23:12ID:???
FastCGI、SpeedyCGIどちらも専用スレ無いみたい。
0396nobodyさん04/11/21 21:59:13ID:???
まあどっちも専用スレ立てたとしても伸びる気がしないよな
0397nobodyさん04/11/22 04:12:53ID:???
助っ人募集中
http://qb5.2ch.net/test/read.cgi/operate/1093068260/543-
0398nobodyさん04/11/30 19:09:15ID:???
保守
0399nobodyさん04/12/12 22:59:26ID:???
ホッシュ
0400nobodyさん04/12/13 17:32:56ID:???
mod_perl2ってどうよ?
0401nobodyさん05/01/14 14:57:29ID:BN1J93Zh
mod_perl(Apache::Registry)とPostgreSQLを使ってプログラム組む事になりました。
Apache::DBIをつかってコネクションをkeepしたままにしておくと、
httpdに比べてpostmastarのプロセスがやたら増えてしまい、最終的には
コネクションエラーになっていまいます。
現在httpd.confのMaxSpareServersを32、postgresql.confのmax_connectionsを256
にして急場を凌いでいます。
解決策をご存知の方、お助け下さい。
0402nobodyさん05/01/17 05:35:14ID:???
Apache::DBIが有効になっておらず毎回新しいコネクション張りなおしてるんじゃないの?
正常ならpostmasterのプロセスは32より増えないはず。postmasterとhttpdのプロセスを監視してみれ。
040340105/01/19 10:18:58ID:???
>>402
解決しました。というか原因はWebアプリではありませんでした。
裏で動かしていたデーモン(同一DBにアクセス)がバグっていました。
0404nobodyさん05/02/11 11:12:30ID:???
another htmllintをmod_perlで動かした椰子いる?
0405nobodyさん05/02/14 10:47:25ID:???
>>404
Apache::RegistryでもPerlRunでも
無限ループっぽくなった
0406nobodyさん05/02/16 01:08:49ID:???
Apche2とmod_perl-1.99で、XML::GDOME::XSLTを動かした人いますか?
Apache1.3とmod_perl-1.29で動いていたスクリプトが、Segfaultしまくります。
XML::GDOME::XSLTは全然バージョンアップされていないようだし。
他のXSLTモジュールを使うしかないか・・・
0407nobodyさん05/02/16 02:44:32ID:???
>>406
http://www.google.co.jp/search?q=expat+mod%5Fperl
これかな?
040840605/02/16 10:11:27ID:???
>>407
残念ながら違うようです。
というか、それを避けるためにXML::GDOME系を使っています。
XML::GDOME系はlibxml2とgdome2を使っており、expatは使っていません。
createDocFromStringはOKでcreateDocFromURIはダメみたいです。
0409nobodyさん05/02/16 10:30:18ID:???
>>406
mpm_preforkで試してる?
http://httpd.apache.org/docs-2.0/mpm.html
041040605/02/17 13:18:09ID:???
>>409
意識はしていませんでしたが、preforkになっていました。
0411nobodyさん05/03/07 17:35:36ID:???
rootにsetuidしてスクリプトの中で各ユーザーにsetuidするというプログラムを動かしたいのですが
mod_perlで動かすとsetuidされているファイルでも動作権限が
apacheの権限になってしまいますがこれは仕組み上、しょうがないでしょうか?
rootにsetuidするためにはapacheをroot権限で動かさないとやっぱ駄目なのかな
0412nobodyさん05/03/07 18:29:35ID:???
BIG_SECURITYHOLE
0413nobodyさん05/03/07 22:28:12ID:???
>>411
それができたらすげーいいよなとは俺も思うのだが
UNIXのプロセスと権限管理の仕組として無理
apache を root で動かすという極めて危ない橋を渡らざるを得ない

もちろん、mod_perl から別プロセスを立ち上げれば、そいつを setuid することはできる
けど、別プロセスを作りたくないからわざわざ mod_perl を使うんだよな
0414nobodyさん05/03/08 00:24:47ID:???
やっぱそうですよね orz
0415nobodyさん2005/04/14(木) 14:25:33ID:???
/home/*/public_html を @INC に追加ってできない?
ユーザ追加する度に httpd.conf を弄るのは…(;´Д`)
0416nobodyさん2005/04/14(木) 14:57:54ID:???
>>415
既存のモジュールをユーザーに勝手に上書きされたらどうすんのさ。
0417nobodyさん2005/05/20(金) 12:10:42ID:Td1z8gJo
MOD_PERL2.0の起動の仕方について

1日掛かりでやっとの思いで以下のキーワードをDOS窓で入力して
ppm install http://theoryx5.uwinnipeg.ca/ppms/mod_perl.ppd
mod_perl.so(Mod_perlモジュール)をインストール出来ました。
そして、httpd.confに以下のコマンドを追加して、extra.plをhttpd.confと同じフォルダに置き

##Mod_perl##
LoadFile "C:/usr/local/bin/perl58.dll"
LoadModule perl_module modules/mod_perl.so
PerlRequire "C:/Program Files/Apache2/conf/extra.pl"
#Alias /perl/ "/Apache2/perl/"
<Location /perl>
SetHandler perl-script
PerlResponseHandler ModPerl::Registry
Options +ExecCGI
PerlOptions +ParseHeaders
</Location>
##Mod_perl##

Apacheを起動してもDOS窓は、画面に何もコメントを表示しないまま閉じてしまいます。
Mod_perlモジュールをインストールしてから、Apacheを起動するには一体どの様にすれば
宜しいかどうか教えて下さい。
ちなみに私は以下URLを参照しました。
ホームサーバの構成
http://eazyfox.homelinux.org/etc/serverspec.htm
Mod_perl2.0のWin32の説明
http://perl.apache.org/docs/2.0/os/win32/config.html
extra.plも上の両ページに書かれている内容を埋め込んでやってみましたがどちらも結果は同様です。

どうかご教授宜しくお願いします。
0418nobodyさん2005/05/20(金) 22:20:38ID:???
>>417
まず error_log を見ろ。全てはそれからだ。
0419nobodyさん2005/05/21(土) 00:03:42ID:rPKP3rpi
418さん>
只今見つけました。
なにしろerror_log の存在は存じてなかったもので。エラーは以下の通りです。
[error] Can't load Perl file: C:/Program Files/Apache2/conf/extra.pl for server localhost:80, exiting...

このエラーですが、PerlRequireでRequireしたextra.plに構文ミスがある場合にも
適用されます。

改めて宜しくお願いします。
0420nobodyさん2005/05/21(土) 00:49:11ID:???
>>419
Can't load Perl file
って書いてあるんだから、そのまんまだろ。
パスは合っているのか?
mod_perl 以前に perl でそのファイルを普通に読ませてエラーは出ないのか?
0421nobodyさん2005/05/21(土) 12:02:12ID:rk+ZZalH
420さん>
>Can't load Perl file
>って書いてあるんだから、そのまんまだろ。
>パスは合っているのか?
はい、extra.plに
print "XXX";
だけにしてApacheを起動したら、"XXX"が表示されましたので、パスが正しいのは
確かめられました。

>mod_perl 以前に perl でそのファイルを普通に読ませてエラーは出ないのか?
extra.plを
Mod_perl2.0のWin32の説明
http://perl.apache.org/docs/2.0/os/win32/config.html
の内容にして、perlにてDOS窓で起動させたら以下のエラーメッセージが出ました。

C:\Program Files\Apache2\conf>perl extra.pl
ModPerl::Const object version 1.999024 does not match bootstrap parameter 2.0000
00 at C:/usr/local/lib/DynaLoader.pm line 253.
Compilation failed in require at C:/usr/local/site/lib/Apache2/Const.pm line 17.

BEGIN failed--compilation aborted at C:/usr/local/site/lib/Apache2/Const.pm line
17.
Compilation failed in require at extra.pl line 9.
BEGIN failed--compilation aborted at extra.pl line 9.

これで、目的のPMのパスが合ってる事が確かめられると思いますが、何しろPMは人が作成した
もので解決のしようが有りません。

どうしてでしょうか、改めて宜しくお願いします。
0422nobodyさんNGNG
http://oshiete1.goo.ne.jp/kotaeru.php3?q=1398764
0423nobodyさん2005/05/21(土) 12:57:37ID:rk+ZZalH
422さん>
マルチポストは良くない事は解ってますが、Mod_perlの場合、おそらく熟知されてる
方が少ないので、いくつかの掲示板で同じ質問をポストしないと回答が戴けない事も
あるので、そうしました。
どうかご容赦下さい。
実際に
http://oshiete1.goo.ne.jp/kotaeru.php3?q=1398764
では、回答を戴けない事もありえそうです。
0424nobodyさん2005/05/21(土) 13:10:00ID:???
>>423
そういう場合、しばらく待って返事がないようであれば
「こちらに投稿しましたが返事がないので…」
…ってマルチポストを事前に断るのがマナー。
0425422NGNG
べつにマルチを責めたわけじゃないけど、どっかで見た質問だと思ったんで
リンクしてみた。 インターネッツの世界が広がった瞬間でもあった。。

gooで回答して良回答ポインツもらってもいいけど、ここで回答しておく。
参考にしたサイトにできるだけ忠実にインストールすると
できると思う。特にApacheをインストールしている場所が "Program Files"
の中ということで、これにはフォルダ名に空白が含まれているから実行でき
ない場合もある。
Cドライブ直下に再インストールしてみてみてみ。あとAliasがコメントだが・
0426nobodyさん2005/05/22(日) 14:10:13ID:3yEsfTzN
425さん>
Apache2をCに移動し、httpd.confも
C:/Apache2/
にパスを書き直しましたが、やはり結果は変わりません。

ホームサーバの構成 の内容で
http://eazyfox.homelinux.org/etc/serverspec.htm
の通りにextra.plを作成してもApacheは閉じてしまいます。
Perlでそのextra.plを開いて見ると以下のエラーが出ますが

C:\Apache2\conf>perl extra2.pl
Can't locate Apache2.pm in @INC (@INC contains: C:/usr/local
te/lib .) at extra2.pl line 1.
BEGIN failed--compilation aborted at extra2.pl line 1.

C:/usr/local/site/libにApache2.pmはないです。Apache2のフォルダは
ありますが。

一体、どの様にすればMod_perl2.0を動かせるようになるのでしょうか?
改めてご教授宜しくお願いします。
0427nobodyさん2005/05/22(日) 23:37:12ID:3yEsfTzN
426の者です。
追記です。

参考サイト
http://eazyfox.homelinux.org/etc/serverspec.htm
を忠実にやろうとした所で、ウチはActivePerl5.8.1で、Apache2.pmと
いうモジュールはどこにもないし
C:Perl/lib/Apacheは、参考サイトのextra.plのApache::とは全然違うモジュールばかりです。

Apache2.pmのキーワードでネットで検索して見ましたが、具体的なヒントは得られませんでした。

一体何故
本家
http://perl.apache.org/docs/2.0/os/win32/config.html
と参考サイトのextra.plは内容が異なっているのでしょうか?
参考サイトは、extra.plが何故use Apache2 ();
use Apache::
なのでしょうか?
その点が私には理解出来ません。
どうしてマニュアル通りにやってその結果が約束されないのか私にはとても納得行きません。

やはり、どの様な手をつくした所でmod_perl2.0のインストールはどうしても完了出来ません。
そんなにmod_perlの導入は、サーバ構築の上級者でないと出来ない技なのでしょうか?
でもどうしてもmod_perl2.0のインストールしたいんです。

改めてご教授宜しくお願いします。
0428 ◆hikArinCL2 2005/05/23(月) 00:15:12ID:???
>>427
RC5(1.999_22)になってからモジュール構成が大幅に変更されたためです
ですからRC5以降はApache2もApacheもありません
(現在提供されているWin32のmod_perl2のバージョンは2.000_00です)

参考サイトの情報はmod_perl2のRC4以前の情報なので、
現在のmod_perl2には適用できません
本家のドキュメントを参照したほうがいいです

詳しいことはChangesを見ましょう(英語ですが)
http://search.cpan.org/~gozer/mod_perl-2.0.0/Changes
0429nobodyさん2005/05/23(月) 13:36:19ID:6v1jDvRv
428さん>
やっぱりmod_perl2.0のセットが変わってしまったんですね。Changesを解読するのは大変ですね、Yahoo翻訳でもとんちんかんな和訳ですで、マニュアルは本家一本に統一される形となりました。

決断して、Activeperl、Apacheを一度全てアンンインストールしてActiveperl5.8.6とApache2.054を再インストール、そして、本家の通り
http://perl.apache.org/docs/2.0/os/win32/index.html
をやり方に絞り再挑戦しました。

そして、
ppm3 install http://theoryx5.uwinnipeg.ca/ppms/mod_perl.ppd
でmod_perl.soをもう一度DLして自動インストールした所、
Mod_perl::Util.pm
のVerがアンインストール前は1.999024で、再インストール後は2.00000になってたので、それが元で421に書かれてるエラーになったらしかったです。

Verも合ったので今度こそはの思いも空しく今度は以下のエラーに引っかかりました。

C:\Apache2\conf>perl extra.pl
Can't load 'C:/usr/local/site/lib/auto/APR/APR.dll' for module APR: load_file:こ
のアプリケーションの実行に必要なライブラリ ファイルの 1 つが見つかりません。 at
C:/usr/local/lib/DynaLoader.pm line 230.
at C:/usr/local/site/lib/APR/Const.pm line 18
Compilation failed in require at C:/usr/local/site/lib/APR/Const.pm line 18.
BEGIN failed--compilation aborted at C:/usr/local/site/lib/APR/Const.pm line 18.

Compilation failed in require at extra.pl line 10.
BEGIN failed--compilation aborted at extra.pl line 10.

APR.dllはパス通りのDirにありました。
あるのに何故dllがロード出来ないでしょうか?

どうか引き続きご教授宜しくお願いします。
0430 ◆hikArinCL2 2005/05/23(月) 22:56:28ID:???
>>429
>>417を見ましょう
要はDOS窓からperlで呼び出すのではなく、
Apacheを起動させるのが正しいです

Apacheの起動が正常の場合は何も言わずにDOS窓を閉じます
エラーが起こった場合はエラー内容を表示してescを押すまで
30秒間待ってそれから自動的に閉じるようになっています
0431nobodyさん2005/05/24(火) 10:40:05ID:dxfDHIc8
430(◆hikArinCL2)さん>
Apacheが閉じれば、ブラウザでスクリプトを呼び出しても「表示ができません」と
でて、エラーログにも
[error] Can't load Perl file: C:/Program Files/Apache2/conf/extra.pl for server localhost:80, exiting...
が相変わらず記録されます。
そしてウチの場合、Apache側にエラーが起きてもDos窓に何らかのメッセージが出てアッと
いう間に閉じます。
で、Apacheが閉じれば、決してブラウザでLocalhostは動きません。

もう、捨て身ですが
C:\Apache2\bin> ab -n 5 -c 5 http://localhost/perl/printenv
をDos窓に打ち込んだりもしました。
何らかの反応がありましたが、どういう処理をしたか解りません。

417の何処を読めば解るのでしょうか?

結局、ここまで悪戦苦闘してもどうしても出来ません!
Mod_perlのインストールごときでWeb設定の業者に設定を依頼する方ないのかな?
宜しくお願いします。
0432nobodyさん2005/05/24(火) 14:28:44ID:???
>>431
ActivePerl5.8.3とApache2.0.54はインストール済みだったので試しにmod_perlインストールしてみました
インストールまではスムーズに行ったけど同じくPerlRequireでcan't load perl fileと言われちゃいました
自分の場合はuse CGIで古いCGI.pmを読み込んでいたためでコレを削除して
C:/usr/site/lib/CGI.pmの方を読み込むようにさせたらエラーは出なくなりました。
とりあえずextra.plの内容を1行ずつ追加してどこでエラーになるか確認してみてはどうでしょう
04334322005/05/24(火) 15:37:49ID:???
>>431
自分の経験から考えたこと
ActivePerlが/usr/localにインストールしてあるのなら
/usr/local/libを/usr/local/lib_bakとかにリネームしたらどうでしょう(削除や移動でもいいんですけど)
多分/usr/local/libと/usr/local/site/libで同じpmが混在してるために不具合が起こっているような気がします。
04344322005/05/24(火) 16:00:47ID:???
ごめん
>>433は見なかったことにしてくれ
04354322005/05/24(火) 17:23:53ID:???
>>431
ActivePerl5.8.6をダウンロードしてインストールしなおしてみました
結果ActivePerl付属のCGI.pmが古いためにエラーが起こっているようです
CPANからCGI.pm3.10をダウンロードして入れ替えたらOKでした
0436 ◆hikArinCL2 2005/05/24(火) 22:20:49ID:???
>>432の言ったCGI.pmのバージョン依存を忘れていた・・・

ppmから入手出来るのは2.91なので、最新版の3.10をCPANからダウンロードして
その中のCGI.pmを
C:/usr/local/lib/CGI.pm(perlのパスがC:/usr/local/bin/perl.exeの場合)
のようにコピーする
面倒であればextra.plのuse CGI ();の行を削除する
(extra.plはモジュールをプリロードするためのスクリプトなので、
モジュールの読み込みのオーバーヘッドを防ぐ目的以外では必要ない)

それにしても>>431がmod_perl2を導入しようと思ったのは何故か気になる
0437nobodyさん2005/05/25(水) 11:36:35ID:C+b2OYt6
436さん>
CGI.pmの交換で、ようやくApacheの起動だけは出来る様になりました。しかし、それから先が進めません。
以下のスクリプトを作成して

#!C:/usr/local/bin/perl -w
# http://localhost/cgi-bin/sr.pl
use strict;
use vars qw ($D);
print "Content-type: text/html\n\n";
print "Hello \$ENV{'MOD_PERL'}=$ENV{'MOD_PERL'}:\$ENV{HTTP_USER_AGENT}=$ENV{HTTP_USER_AGENT}";

MOD_PERLが動くかどうか試したんですが、$ENV{'MOD_PERL'}に値が格納されないし
use strict;
use vars qw ($D);
が無い状態でも普通にブラウザに結果が表示され、どうみても普通のPerlの動きしかしません。

後、以下URLを元にHello.pm
http://perl.apache.org/docs/2.0/os/win32/config.html#Hello_World
をC:/usr/local/bin/site/lib/Apache2に作成しhttpd.confにも、それが動く様追記したんですが、そうするとHello.pmがロード出来ないとうエラーログが記録されApacheが閉じてしまいます。

一体、Apacheが起動出来る様になった後、一体どの様にすればMOD_PERLとしての動作が確認出来ますか引き続きご教授宜しくお願いします。

尚、XSLoader.pmも最新Verに交換しました。

>それにしても>>431がmod_perl2を導入しようと思ったのは何故か気になる

自身、数百kbにも及ぶ大規模CGIシステムを作成してて、かなりの高アクセスを前提にしている事もありこれを
長期に渡りPerlで書き上げてしまい、PHPで動くCGIシステムが普及しているさなか、レスポンスが遅いと同種
サービスの競争に負けてしまいそうになると思い、PHPはPerlより簡単だと言われてるけどもやった事ないんで
、それを習得してPHPに書き直す作業を行えば、CGIを作るのに膨大な年月が掛かった上に更に膨大な期間が必
要になると思い、その解決策という思いついたのがMod_perlなのです。
0438nobodyさん2005/05/25(水) 12:23:31ID:???
>>437
cgi-bin内はCGIとして動作する設定なんじゃないの
.plをmod_perlとして設定してあるならcgi-binの外に出せば
0439nobodyさん2005/05/25(水) 13:52:40ID:???
>>437
Yahooの掲示板でお前なんかやめちまえって言われてた人か?

http://oshiete1.goo.ne.jp/kotaeru.php3?q=1398764 のレスは放置かいな。

一応まじめにレスしておくけど数百kbにも及ぶ大規模CGIシステムとやらはmod_perlで動くように作られているの?
魔法の箱じゃないんでそれ用の記述をしないと真価を発揮できないし動くかどうかも怪しいと思うぞ。
それ以前にサーバーのチューニングのほうが先でしょ?
試しにMSWin32に入れてみたけど設定を変更しただけで既存のファイルは入れ替えることなく動いたので、全く動かなければあんたの使い方が悪い可能性が高い。

__PACKAGE__ => ModPerl::ROOT::ModPerl::Registry::C_略_cgi_2dbin_test_2ecgi
MOD_PERL => mod_perl/2.0.0
MOD_PERL_API_VERSION => 2
SERVER_SIGNATURE => Apache/2.0.54 (Win32) mod_perl/2.0.0 Perl/v5.8.6 Server at 127.0.0.1 Port 80
SERVER_SOFTWARE => Apache/2.0.54 (Win32) mod_perl/2.0.0 Perl/v5.8.6
0440nobodyさん2005/05/25(水) 18:18:22ID:C+b2OYt6
一週間私の為に付き合って下さりありがとうございます。
438さん>
はい、スクリプトをcgi-binからhttpd.confで指定したAlias /perl/ "C:/Apache2/perl/"と同じDirに
移し替えたら、Mod_perlとして動かせました。動かすまで一週間掛かりました。
439さん>
>http://oshiete1.goo.ne.jp/kotaeru.php3?q=1398764 のレスは放置かいな。
一応、回答が戴けてるので...焦ってた事もあり失礼だと思ってます!
>Yahooの掲示板でお前なんかやめちまえって言われてた人か?
それは、どのスレッドですか?

>一応まじめにレスしておくけど数百kbにも及ぶ大規模CGIシステムとやらはmod_perlで動くように作られているの? ..

私の作成したCGIシステムがそのままMod_perlで動くとは思ってません。Mod_perlに慣れてから、動く様に訂正
するつもりです。私はアパッチは今まで利用してなかったので熟知してないのですが、サーバーのチューニン
グというのはどの様にすればいいのでしょうか?ちなみに私も__PACKAGE__ 、MOD_PERL、SERVER_SIGNATURE 、SERVER_SOFTWARE は__PACKAGE__は空値でしたが439さんと同じ値が取れました。

でMod_perlでテスト用スクリプトを走らせて見ましたが以下の問題が起きました。

以下の様に変数をインポートしても初期化されずブラウザをリロード毎に$Dが追加算される。
strict.pm&var.pmは変数の使用許可するだけの役割
#!/usr/local/bin/perl -w     
use strict;  use vars qw ($D);
$D+=5;
だから、自分で変数を初期化するルーチンを作りました。
sub EZ{my($s); for($s=0;$s<@_;$s++){$_[$s]="";}}

以下の様にライブラリを読み込んだらライブラリにpackage宣言されてもサーバーエラーになる。
require "as.pl"; &as::pre($D,$S);

後、MOD_PERLの場合、ライブラリへのpackage宣言は避けられないんでしょうか?
宜しくお願いします。
0441nobodyさん2005/05/25(水) 21:36:48ID:C+b2OYt6
440の続き
ライブラリの事
PCでライブラリをrequireする際は、require "C:/Apache2/perl/as.pl";の様な
フルパスが必要でした。
バーチャルホスト設定でブラウザ実行の際、エラーログが取れる様になり解りました。

Mod_perl2.0でのライブラリへのpackage宣言は強要されてませんでした。
package宣言が嫌なら宣言不要です。

それにしてもMod_perlのブラウザテストて、メモリにスクリプトや変数値が
常駐するので、いちいちアパッチを起動しなきゃならなくて面倒ですね!!

でもライブラリがパッケージ化不要で使える事をしり、いささか実用化の希みが出ました。

0442 ◆hikArinCL2 2005/05/25(水) 22:20:29ID:???
>>440-441
・パスは絶対パスで(相対パスだとApacheのディレクトリ)
・変数の初期化にはmyを使う(varsはグローバル変数を指定する別物)
・ModPerl::RegistryのスクリプトやApacheハンドラは常駐が当たり前

mod_perlはスクリプトがクリーンなコードでないと凶器になります
先頭パスに-wを指定するとエラーログが相当なものになります

>>437と>>441の内容からしてOOPという概念がなくて、スクリプトの保守が大変そうだな、と思った
0443nobodyさん2005/05/25(水) 22:41:01ID:???
とういうか、この程度の理解でmod_perlを使うとは・・・
0444nobodyさん2005/05/25(水) 23:01:15ID:C+b2OYt6
442、443さん>
外部でmy宣言した変数、配列はライブラリ先のサブルーチンまで引き渡せない。
で、変数は
sub EZ{my($s); for($s=0;$s<@_;$s++){$_[$s]="";}}
でどうにか初期化が簡潔的に出来る。
my($A)の代わりにEZ($A,$B)にすれば初期化された$Aでライブラリを越えてどこにでも
値が届く。
でも配列は以下のルーチンを試して見ましたが駄目でした。

EA(AB,CD);
sub EA{my($s); for($s=0;$s<@_;$s++){@$_[$s]=();}}
PUSH(@AB,'A');
PUSH(@CD,'B');

mod_perlはよほどの知識がないと使うとやばいですか?
やっぱ、普通のPerlでサービスにトライする他ないんかな、スピードはサーバー
の環境に期待する他無い!!

0445nobodyさん2005/05/25(水) 23:43:04ID:???
>mod_perlはよほどの知識がないと使うとやばいですか?
というより、perl自体の知識が無いようなのでね・・・。
多少意識して書けば、cgi→mod_perlの移行は、
難しくないのになぁ。
しかも、mod_perlはapache1つじゃきついとおもうよ。
0446nobodyさん2005/05/26(木) 00:05:56ID:???
いやー、人間って、一度自分で痛い目に合わないと、
コードをクリーンに書くことの意味に気づかないと思うよ。
でまあこの人はまさにその渦中にいると。


>EA(AB,CD);
>sub EA{my($s); for($s=0;$s<@_;$s++){@$_[$s]=();}}
>PUSH(@AB,'A');
>PUSH(@CD,'B');
>mod_perlはよほどの知識がないと使うとやばいですか?

これはひょっとしてシンボリックリファレンスを使おうとしている?
だとしたら、かなりやばい。
0447nobodyさん2005/05/26(木) 10:44:11ID:/bJEfdxI
445、446さん>

Perlの利用暦は5年以上ですが、自身コードをクリーンに書く方ではないので
上級レベル迄には達してないと思います。
でもキャリアが長いので、Perlに関してはある程度ペラペラです。
沢山の大規模CGIをPerlで書いて来ましたが、気がつけばPHPの時代という憂き目に会って
しまってます!

mod_perlは慎重に使わなければいけませが、折角出合ったので初心に返って習得して
実用出来る様にしたいです。

変数、配列の一括初期化の方法は関数作らず共、こんなに簡潔に出来ました。

($D,$S,$Z)="";
(@vet,@popron,@btys)=();
これでmy宣言による使用域の制約から逃れられます。
■ このスレッドは過去ログ倉庫に格納されています