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

mod_perlを使おう!

■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん01/11/07 17:42ID:+Gux2iOQ
CGIを激速で実行できるmod_perlについて語りませう。
関連リンク等は>2
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宣言による使用域の制約から逃れられます。
0448nobodyさん2005/05/26(木) 13:17:16ID:???
>>447
> でもキャリアが長いので、Perlに関してはある程度ペラペラです。

質問1. my の他に our ってあるの知ってる?
質問2. プラグマは何種類くらい覚えてる?(マニュアル見ないで書ける?)

あとmod_perlがそもそも何なのか全然分ってないようだから、とりあえず
オライリーの「Apache拡張ガイド(上)」を読んでみることをおすすめする。
ttp://www.oreilly.co.jp/books/4873110181/
0449nobodyさん2005/05/26(木) 14:15:01ID:/bJEfdxI
448さん>
痛いトコ付きますね!
2つの質問については正直不案内でした。
ourで変数を宣言してもMod_perlにては初期化されませんでした。
mod_perlは勉強する点が色々ありますね!
Perlがスラスラ書けると思い上がってました。

本の紹介どうもありがとうございます。

ついでに
use vars qw ($D $S $Z $SP @popron @vet @btys %in %rt);
($D,$S,$Z,$SP,@popron,@vet,@btys,%in,%rt)="";
の様に同じ配列が2つあるけど、それではスクリプトが複雑になるので以下みたく
@LIST=qw \($D $S $Z $SP @popron @vet @btys %in %rt);
use vars qw(@LIST)
@LIST=();
の様に配列名にパックして綺麗に書いて実行したいけどどの様にすれば宜しいでしょうか?
上の@LISTを使って実行しましたがエラーでした。
0450nobodyさん2005/05/26(木) 14:27:48ID:???
>>449
あのさ、ここサポセンじゃないんで、ヨソに行ってもらえないかな。
0451nobodyさん2005/05/26(木) 17:16:42ID:???
とりあえず
ttp://perl.apache.org/docs/1.0/guide/porting.html
0452nobodyさん2005/05/26(木) 19:21:56ID:???
日本語版はないの?
0453nobodyさん2005/05/26(木) 21:12:00ID:/bJEfdxI
448さん紹介のオライリーの「Apache拡張ガイド(上)」、大書店で確認して来ました。
でも¥4,800もするのでは!!(汗)
どうしようか迷ってます。
でもMod_perlを使うには、それなりの勉強が必要だし、買おうか買うまいか?
でも折角だからMod_perl極めたいです。
0454nobodyさん2005/05/26(木) 22:46:48ID:???
なんかRegistryBBつー最強の掲示板が内蔵されたらしい。
RegistryPreforkはちゃんと使えんのかね?
0455nobodyさん2005/05/27(金) 00:04:08ID:???
ModPerl::RegistryBB - Run unaltered CGI scripts persistently under mod_perl

"ModPerl::RegistryBB" is similar to "ModPerl::Registry", but does the
bare minimum (mnemonic: BB = Bare Bones) to compile a script file once
and run it many times, in order to get the maximum performance.

Whereas "ModPerl::Registry" does various checks, which add a slight
overhead to response times.
0456nobodyさん2005/05/27(金) 09:07:23ID:???
>>453

申し訳ないけど、多分、mod_perlうんぬんより、
perlの方をどうかした方がいいんじゃないのかな、、
use strict;で動く?
-wTでエラーでない?


0457nobodyさん2005/05/27(金) 11:28:17ID:UfO/Wu7H
456さん>

>申し訳ないけど、多分、mod_perlうんぬんより、
>perlの方をどうかした方がいいんじゃないのかな、、
>use strict;で動く?
>-wTでエラーでない?
-wと変わりません。

use strict;
use vars qw ($D $S $Z $SP @popron @vet @btys %in %rt);
($D,$S,$Z,$SP,@popron,@vet,@btys,%in,%rt)="";

でMod_perl2.0は動作します。
後、exit;も使えます。

やっぱり、1週間掛かりで自分の手でMod_perlは動かせるようになったんだし、それなりに
興味が沸きました。
Mod_perlを是非学び極めたいです。
そうする事により、スクリプトを綺麗に書く自覚が芽生えて来ると思います。
投げたら何も進歩がありません!
0458nobodyさん2005/05/27(金) 12:06:34ID:???
mod_perl で失敗しないスクリプトを書くために洩れが心がけていることとしては

・use vars は @ISA など一部の例外を除いて一切使わない
・全ての変数を my で宣言する
・スコープ外の変数をいじるときはハードリファレンスで参照渡しする
・変数がいつ消滅するかを明確に意識する
0459nobodyさん2005/05/27(金) 12:16:03ID:???
>>457
分かったからヨソでやってくれない?
ウザったいと感じてる人間が少なからずいるんだから。
0460nobodyさん2005/05/27(金) 13:00:56ID:UfO/Wu7H
459さん>
Mod_perlのスレッドでMod_perlに関する話題を書き込んで何がいけないんですか?
納得に行きません!
0461nobodyさん2005/05/27(金) 13:50:13ID:???
いや、
mod_perlというより、perlの話題(質問)でしょ。
それも、かなり基本的な、、
多分、perl4の人なんだろうけど。
0462nobodyさん2005/05/27(金) 14:10:57ID:???
>>459
大変申し訳ありませんがウザいのでヨソいってください。
0463nobodyさん2005/05/27(金) 15:31:11ID:???
>>454
つーか,かなり前からあるし。
0464nobodyさん2005/05/27(金) 15:48:29ID:???
use strict;
use warnings;
use sigtrap;
# use diagnostics;
0465nobodyさん2005/05/27(金) 17:54:10ID:UfO/Wu7H
Mod_perlにてテスト結果でこういう事が分かりました。

use strict;
my($D,@popron,%in);
の様に外部でMY宣言してもMYの有効範囲はあくまでもその宣言のあるスクリプト内。
よって、requireでロードされてるライブラリではグローバル変数のままの為
変数の初期化がされず値が増えてしまってる事が判りました。

やっぱ、以下のだと変数の完全初期化が果たせました。
use strict;
use vars qw($D @popron %in);
($D,@popron,%in)="";

何故、Mod_perlの初期化にmyで書くんだろう?

PS:この話題はMod_perlの事言ってるので、反感を買う筋合いは有りませんよね!
0466nobodyさん2005/05/27(金) 17:59:51ID:???
>>465
my は変数を宣言するものであって、初期化してくれるわけではない
0467nobodyさん2005/05/27(金) 18:00:06ID:???
>>465
Apacheのサイトのドキュメントぐらい読んだらいいよ
mod_perl1.0の方からね
my と ourの違いとか
0468nobodyさん2005/05/27(金) 18:06:25ID:???
>>465
リロードしてわかるmyとourの違い
#!/usr/bin/perl -w
use strict;

print "Content-type: text/plain\r\n\r\n";

my $counter = 0; # Explicit initialization technically redundant
#our $counter = 0;

for (1..5) {
increment_counter();
}

sub increment_counter{
$counter++;
print "Counter is equal to $counter !\r\n";
}
0469nobodyさん2005/05/27(金) 20:51:38ID:UfO/Wu7H
468>
my $counter = 0;
#our $counter = 0; でやったら
increment_counter();
内の処理が最初の1回だけ処理若しくはスクリプトを修正して1回目だけ
なされて、それ以降はスルーでした。よってスルー後の$counterの値は0でした。
逆にourを有効にさせればあらゆる$counterが追加算され値が増えていきます。

つまりmy宣言とour宣言の同名の変数は別物であり、ourはグローバル変数そのもの
0470nobodyさん2005/05/27(金) 22:19:03ID:???
Perl の勉強は他のスレでやろうよ。
ModPerl 以外の話題でスレが流れるのはカンベン。
0471nobodyさん2005/05/27(金) 23:09:19ID:UfO/Wu7H
470>
私は、468の質問に回答しただけです。
Perlの勉強といってもMod_perlと関連性が非常にある訳ですか、それならココを
使っても問題ないでしょう?
Mod_perlを語るにPerlのプログラミングで説明する事は欠かせません!
469もMod_perlにてこのプログラムはどう動くかを述べてるのでMod_perlと大いに
関連があり、よってココを使っても攻められる筋はないと存じます!
0472nobodyさん2005/05/27(金) 23:47:40ID:???
print 'バグってるぞ__END__このやろう';
普通に__END__が使えるようになったのかと思ったらこれがエラーになるってどういうことよ。

>>471
こんなところで油売ってる暇あったらPHPでも覚えれば?
0473nobodyさん2005/05/28(土) 01:51:25ID:???
ここにいていいのはPerlの基礎が分かってる人だけ。
ここでアホな質問続けてるやつはmod_perl以前の問題やん。
0474nobodyさん2005/05/28(土) 07:20:42ID:???
>>470
>>468はPerlCGIとmod_perlで動作が違うので注意が必要といいたかったんです。
0475nobodyさん2005/05/28(土) 10:34:31ID:xzv7Jv78
472、473>
Perlはある程度判ってるつもりです。5年以上もやって来たので。
私は、確かに常識が薄い人間ですが、ココではMod_perlで利用するというモラル
を心がけて使わせた戴いた結果がこの結果(攻められる)になりとても自分が悔しく
感じてます。
どうして、心がけて使いながら邪魔者にならなければいけなのか?

mod_perlだってperlの1つなのです。
で、471でもいいましたがmod_perlを語るにPerlは欠かせないんです!

1週間も素人の私の為に付き合っていただき、正直断念の1歩手前迄来ていたのが
mod_perlを動かせる様になったんです。
それは大変感謝しております!
mod_perlの設定は、一筋縄では行かないので、何度も有識者に尋ねて進めなければ
ココまで辿り着けなかったと思います。
ユーザの少ないmod_perlの議論が出来る様な所は他には見当たり難く、その為にも
ココの掲示板でのコミュニケーションが必要です。

この様な結果になってしまいましたが、どうか、そのモラルを心がけてココを使わせて
戴いた事だけは理解して戴きたいです。

今後も更にMod_perlを極めたいのでココを利用させて戴きたいです。
どうか宜しくお願いします。
0476nobodyさん2005/05/28(土) 12:06:30ID:DRXi0Wgp
だってここ2ちゃんねるだもん
0477nobodyさん2005/05/28(土) 14:41:41ID:???
>>475
5年はさすがに嘘だろ。せいぜい1ヶ月ぐらいしかやってないレベル。
mod_perlを極めたいなら、まずPerl自体を知らないと無理。
0478nobodyさん2005/05/28(土) 14:52:27ID:???
というか「mod_perlを極める」の意味が分からんな。
>>465のようにmyすら知らないのはPerl自体まともに書けないから。
myはmod_perl専用のキーワードではないわけだし。

他の人も言ってるが、まずPerlをまともに書けるようにならないと無理。
mod_perl特有の注意点を教えたところで全く理解できてないじゃないか。
0479nobodyさん2005/05/28(土) 16:50:00ID:???
いや、「KENTを参考に5年勉強しました」だったらあり得る話だと思ふ。

まじめな話だが、グローバル変数をパッケージ名修飾で参照したり
シンボリックリファレンス使いまくったりとかなヌルいコードでもとりあえず走ってしまう、
てのが Perl の利点なのかもしれないが欠点でもあって、
困ったことに「ヌルさを極める」方向に走ることを「Perl上級者になった」と思っている人も少なくない。
でまあ、一度痛い目にあってようやく気づくわけだ。
mod_perl がその痛い目の代表例だろうと。
Blosxom の作者である Rael も「mod_perlで動かない」という事実に直面して初めて反省したみたいだし。
0480nobodyさん2005/05/28(土) 17:25:40ID:???
まずあの分厚いオライリー読んでから出直してこいと
0481nobodyさん2005/05/28(土) 17:46:53ID:xzv7Jv78
477〜480>
Perlは本当に5年以上やってます。独学で、教則本を買ったり、オライリーのPerl
を購入したり、とほほwww入門を見たりで、数多くのCGIを作成して、自作のCGIで
実際にレンタルCGIも運営した事あります。
でも私のプログラムを見てもらったり書き方についてのコメントから見て周りからみれば
下手糞だと思われても仕方ないと思います。

後、Mod_perlの対抗馬ともいえるSpeedy.cgiというものもありました。
これも、Perlを高速化するプログラムで、もちろんメモリ常駐型で変数初期化に
気をつけなければなりませんが、以下URLを基に調べてみましたMod_perlに比べる
とプログラムの書き方にシビアにならなくてよさそうです。

http://www.maido3.com/server/option/perlcgi.html
http://perldoc.jp/docs/modules/CGI-SpeedyCGI-2.21/SpeedyCGI.pod
http://sunos.saita.ma/2ch-cgi-lw..html

0482nobodyさん2005/05/28(土) 18:29:09ID:???
> どうして、心がけて使いながら邪魔者にならなければいけなのか?
無能だからだよ。

どれだけ勉強したって、免許持ってなかったら車は運転できないだろ?

対人コミュニケーションも大切だけど、技術的なコミュニケーションも
取れないんじゃウザがられてもしょうがない。
0483nobodyさん2005/05/28(土) 18:48:13ID:???
>>481
>>479の「パッケージ名修飾」「シンボリックリファレンス」の言葉の意味分からないだろ?
それを質問するのはここじゃない。perl初心者スレに行け。
0484nobodyさん2005/05/28(土) 19:01:07ID:???
これだけスコスコに叩かれて、モラルも糞もあったもんじゃないなw
空気が読めない奴は、それだけで犯罪だよ。
0485nobodyさん2005/05/28(土) 21:11:26ID:???
まあ、オライリーの本読んでそれじゃ、
理解できてないじゃないか!
と、おれはいいたい。
0486nobodyさん2005/05/28(土) 21:14:27ID:xzv7Jv78
482~485>
>無能だからだよ。
>対人コミュニケーションも大切だけど、技術的なコミュニケーションも
>取れないんじゃウザがられてもしょうがない。

新しい事を知るには、最初は初心者、知識もほとんどありません!
Mod_perlを極めたくても最初は無知なのです。
ましてはあまり流行ってないMod_perlを知ってる人は数少ないし、Mod_perlのページを
見ても自力で覚えられるに限度があります。そして、Mod_perlの議論が出来る掲示板なんて
ここ以外どこにありますか?!
Mod_perlの知らない人間がその事を学びたく、問答して何が悪いんですか?

Perlも5年以上やってきましたので、確かに私は書き方が荒く、周りからみればPerlの
書き方が未熟と思われても致し方ないと思いますが、ここまで経験があるし、自己主観
ですがPerlの腕前を見てみても、Mod_perlを試してみてもいいレベルには達していると思います。

>「パッケージ名修飾」「シンボリックリファレンス」の言葉の意味分からないだろ?
これらは知ってます。

確かに掲示板の空気は読むのは苦手です。
改めて申しますが、モラルを意識して書き込んだ事だけは理解して下さい。

これで邪魔者扱いされる様ななら、ここの掲示板は不親切過ぎると思います。
空気の読み方や技術的なコミュニケーションは、ココでの事の様に簡単ではない場合も
あります、あからさまにウザがる以前に少し親切な扱いをされてもいいのではと思います。

これだけ反論、自己の事情と利用した際の態度を述べました。
どうかココの掲示板の議論に今後とも参加させて下さい!
0487nobodyさん2005/05/28(土) 21:41:57ID:???
そーやって人の話もロクに聞かず、他人の手柄を自分のものにしてしまうような態度だから会社クビになるんでしょ。
大体なんでそんなにmod_perlにこだわるのさ。
起動するたびに大きなファイルを丸ごと読み込むようなことしてたらmod_perlなんか意味無いよ?
0488nobodyさん2005/05/28(土) 21:43:24ID:???
>>486
他人の話を聞かない奴が議論できるとは到底思えないが?
>Mod_perlを極めたくても最初は無知なのです。
mod_perl云々の前にPerl自体が初心者レベルなのだから、まずPerlの基礎をやれと言っとるんだ。
それができれば自然にmod_perl化できる。というかPerlとmod_perlを別言語だと思ってないか?
Perlがちゃんとできればmod_perl化に苦労はいらない。それができないってことはPerlができてないんだ。
0489nobodyさん2005/05/28(土) 21:53:24ID:???
大漁だなw
0490nobodyさん2005/05/28(土) 22:17:47ID:???
暑くなってきたんでビール飲みながら見ると、すごくいい質問に見えてくるんだなぁこれが。
0491nobodyさん2005/05/28(土) 23:27:54ID:haTNBXhi
大漁大漁言わないでください!
0492nobodyさん2005/05/29(日) 05:16:08ID:???
なんか自分用の「パソ」を10台持ってるからパソコンに詳しい
みたいな奴だな。
0493nobodyさん2005/05/29(日) 11:45:03ID:LobLqbIr
そんなこと言わずに、参加させて下さい!
0494nobodyさん2005/05/29(日) 19:13:32ID:???
部分的 GET(Range) で困っています。
たとえば単純に、

$vi test.cgi
-----
#!/usr/bin/perl

use strict;
use Apache::RequestRec ();
use Apache::Const qw(:common :http);

my($r) = shift; # $r = Apache2::Apache::RequestRec Object
my($headers_out) = $r->headers_out;
$r->status_line('206 Partial Content');
$r->status(HTTP_PARTIAL_CONTENT);
$headers_out->{'Accept-Ranges'} = 'bytes';
$headers_out->{'Content-Length'} = '10';
$headers_out->{'Content-Range'} = "bytes 0-9/10";
$r->content_type('text/plain');
$r->print("0123456789");
return(OK);
-----
$chmod 755 test.cgi

Telnetで
$telnet localhost 80
GET /cgi-bin/test.cgi HTTP/1.1
Host: localhost
Range: bytes=0-9

とすると、レスポンスが
0495nobodyさん2005/05/29(日) 19:14:09ID:???
続きです。

-----
0123456789<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>206 Partial Content</title>
</head><body>
<h1>Partial Content</h1>
<p>The server encountered an internal error or
misconfiguration and was unable to complete
your request.</p>
<p>Please contact the server administrator,
[email protected] and inform them of the time the error occurred,
and anything you might have done that may have
caused the error.</p>
<p>More information about this error may be available
in the server error log.</p>
</body></html>
Connection closed by foreign host.
-----
のように、データの後にエラーのHTMLが吐き出されてしまいます。
error_log は LogLevelを debug にしても何も書き出されませんでした。
0496nobodyさん2005/05/29(日) 19:14:51ID:???
済みません。
更に続きです。

ちなみに、$r->status() を
$r->status(HTTP_OK);
にすると正常?に動作はしますが、ステータスが 200 なので、
約束違反のようで心配です、
まさか、mod_perl はステータスを 206 にするとエラー扱いされる、
または使えないのでしょうか?
それとも、根本的にやり方がおかしいのでしょうか。

mod_perl を使わないで以下のソースで動作させると問題ありませんでした。
-----
#!/usr/bin/perl

use strict;

print "Status: 206 Partial Content\n";
print "Accept-Ranges: bytes\n";
print "Content-Length: 10\n";
print "Content-Range: bytes 0-9/10\n";
print "Contet-Type: text/plain\n\n";
print "0123456789";
-----

Apache/2.0.52 + mod_perl/1.99_16 + Perl/v5.8.0 の環境です。

長々と失礼致しました。
何かヒントを頂ければ幸いです。
よろしくお願いします。
0497nobodyさん2005/06/04(土) 06:49:29ID:???
HTML 2.0って。。。
0498ヽ(´ー`)ノ ◆.ogCuANUcE 2005/06/04(土) 14:51:12ID:???
>>497
Apache 標準のエラーページが HTML 2.0 なだけだが。
0499nobodyさん2005/06/10(金) 21:29:50ID:???
windows の apache2 + mod_perl2 でちょっと使って見たんだけど…。
mod_perl2 配下で動かしたスクリプトのカレントディレクトリが
apache2 のホームになるのを何とかしたいんだけど、方法解る人いる?
できれば、スクリプト起動時にそのスクリプトが置いてあるディレクトリに
移動させたいんだけど

あと、インストールの時、ここを見ながらインストールしたんだが
ttp://multix.jp/html/memo/030524.html (トップページ見るとチョットひくがw)

このページの start.pl の2ヶ所が俺の環境だと動かないからコメントアウトしたんだけど
use Apache2 ();
use ModPerl::Util ();
use Apache::RequestRec ();
use Apache::RequestIO ();
use Apache::RequestUtil ();
# use Apache::Server (); ← 動かない
use Apache::ServerUtil ();
use Apache::Connection ();
use Apache::Log ();
use Apache::Const -compile => ':common';
use APR::Const -compile => ':common';
use APR::Table ();
# use Apache::compat (); ← 動かない
use ModPerl::Registry ();
use CGI ();

これって、俺の mod_perl2 がオカシイって事だよね。何処から持ってくればいいんだろう…。
0500nobodyさん2005/06/11(土) 07:30:12ID:???
>>499
本家のドキュメント見た方がいいと思う
tp://perl.apache.org/docs/2.0/os/win32/config.html
モジュールはCPANから
05014942005/06/11(土) 15:11:32ID:???
自己解決。
Apache API ではなく、CGI.pm を使えば問題ないみたいです。
-----
#!/usr/bin/perl
use strict;
use CGI;

my($q) = new CGI;
print $q->header(-type => 'text/plain',
-status=>'206 Partial Content',
-accept_ranges => 'bytes',
-content_length => '10',
-content_range => 'bytes 0-9/10');

print "0123456789";
-----
CGI.pm なので重たくはなると思うけど、mod_perl を使わないよりは
比べ物にならないくらいマシなので、これでいきます。

それにしても・・・API の使い方が間違っているのかな?
0502nobodyさん2005/06/27(月) 23:40:52ID:???
mod_perl2は仕様がまだコロコロ変わってる希ガス。

Apache2.pmも無くなったよ。
0503nobodyさん2005/11/24(木) 18:30:18ID:5fWGjQ1L
mod_perl1.99(=2という感じでしょうか?)についてお聞きしたいのですが、
ModPerl::Registryな環境で動作させた場合、以前の
Apache::Registryとは、結構違う感じなのでしょうか?
動作しない場合もコードによって出てきそうな気が・・・。
ご存知の方、アドバイスお願いいたします。
0504nobodyさん2005/11/25(金) 23:26:51ID:???
下位互換を高レベルで保ってるから以前と変わらない動作で動くよ。
Apache::reload辺りが変更になってハマった記憶があるけど。
05055032005/11/26(土) 01:05:31ID:???
>>504
情報ありがとうございます。なるほどそうでしたか!
今、Apache2.0 + mod_perl1.99な環境を作っています。
特に、CatalystやCGI::Applicationの動作が問題ないか
気になっていました。
0506nobodyさん2005/11/28(月) 21:12:47ID:c6nvYUNh
先生教えてください!
mod_perlには
CGI::Session Apache::Session
どちらを使うのが効率良いのでしょうか?
0507nobodyさん2005/11/30(水) 17:44:26ID:s8bRu2i2
放置されてて可愛そう・・・
0508nobodyさん2005/11/30(水) 17:59:22ID:???
だって、ベンチマーク取らないとわかんないしさ・・・。
それくらいだったら自分で取ってみたら?って事で。
他のモジュールとの相性もあるだろうし。
おれはCGI::Applicationをよく使うから、CGI::Sessionの
ラッパーのプラグインを使ってるけど。
0509nobodyさん2005/11/30(水) 18:19:56ID:???
何だか>>506=>>507に思えてカワイソス
0510nobodyさん2006/01/02(月) 11:18:27ID:LIsIGKJ1
スレをざっと呼んだ感じ、
  use strict でエラーが無ければ mod_perl に修正無しで動くとは限らない
という認識で OK ですか?

逆に、
  mod_perl 使っててエラーが無ければ、mod_perl 環境外で修正無しで動く
もんなんでしょうか?
0511nobodyさん2006/01/03(火) 02:21:30ID:???
>>510
どっちでも修正は必ずいるよん。
修正する必要がないように作ってあるものはmod_perlの恩恵を受けられないよん。
■ このスレッドは過去ログ倉庫に格納されています