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

mod_perlを使おう!

■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん01/11/07 17:42ID:+Gux2iOQ
CGIを激速で実行できるmod_perlについて語りませう。
関連リンク等は>2
0276nobodyさん03/10/12 09:33ID:5sejX4lf
mod_perl、mod_phpでsuexecを機能させてみたいな。
システム領域をオーバーライドするしか方法はないだろうけど。
suexecのソースを読んでみよう
0277nobodyさん03/10/12 09:43ID:???
>>276
apacheをrootで動かす気かい?
0278nobodyさん03/10/12 09:49ID:5sejX4lf
>>277
Apacheは例によってapacheユーザで動作。
カーネルに関わるプログラムをsetuidして子プロセスの実行権限を動的にするしかないんじゃないだろうか。
擬似的にApacheが複数のUIDで動作すると。suexecより危険度が増すけど
0279nobodyさん03/10/12 12:02ID:???
1ユーザーごとに1つApacheを動かして、マルチスレッドにしておけば良さそう。
0280nobodyさん03/10/12 13:30ID:5sejX4lf
メモリがいくつあても足りないと思う
0281nobodyさん03/10/12 13:31ID:???
いくつ?512MBのメモリをひとつ刺しておけばいいんじゃない?
0282nobodyさん03/10/12 13:53ID:5sejX4lf
そういう問題だけじゃないよ。
CPUが追いつかない。
Apache2なら可能性はあるが
0283nobodyさん03/10/30 15:43ID:MsIzuyZ0
mod_perlもmod_phpのように手軽に使えるようにならん?
そうすれば普及するだろうに。
0284nobodyさん03/10/30 15:53ID:???
互換性がちょっとな・・・
0285nobodyさん03/10/31 22:38ID:???
>>284
CGIプログラムとの互換性のこと?
そんなに変わってくるものなの?
0286nobodyさん03/11/04 18:16ID:???
>>285
・exit();関数は利用できない。代わりに、Apache::exit();を使うそうな。
・パッケージ名を明記すると500 Internal(以下略)。(例: $main::setup)
・SuExecが有効にならない
・もし何かあったら、Apache自体を再起動しなければならない
・mod_perl用に書いたPerlScriptをCGIとして動作させたら、多分動かない。

 知っている限りで。(注:正確な情報ではありません)
0287nobodyさん03/11/04 19:42ID:???
>>286
互換性の問題は速度の代償として多少は仕方ないか。

>・もし何かあったら、Apache自体を再起動しなければならない

ここら辺はmod_phpでも同じなのでは?
0288 03/11/04 20:55ID:1kmjwkim
大規模なeコマースサイトを Apache と mod_perl で構築する
http://bulknews.net/lib/doc-ja/etoys.ja.html
0289nobodyさん03/11/04 22:08ID:???
>>286
・Apache::Registry 使用時なら exit は Apache::exit でオーバーライド
 されていたような。
・main パッケージを明示するようなコーディングスタイル自体が問題。
・CGI プログラムとして組まれているスクリプトは Apache::PerlRun で
 動かす。mod_perl 前提のスクリプトを CGI プログラムとして使うのは
 おかしい。

SuEXEC が効かないのと、httpd の肥え方が激しいのがネックだと思う。
まぁ後者はサーバ分ければいいんだけど。

あと mod_perl 入れたからといって CGI プログラムが使えなくなる
わけじゃないので、Apache::PerlRun でも動かんような糞スクリプトは
割り切って CGI プログラムとして使うのも手。
0290nobodyさん03/11/05 00:00ID:???
mod_perler なら、Apache::Registry使わなきゃ
Apache::PerlRunで満足すんなYO!



ところでさア、お金貸して?
0291nobodyさん03/11/16 07:02ID:???
Action text/html /path/to/cgi
みたいな感じで、テキストを置換するシステム作ってたんだが
XeonMP 2.8G でさえ、30req/sがやっとこさだったのだが、
PerlRun にしたら、100req/s 程度まで向上した。

男はApache::Registryだろうということで、試してみたんだが、
案の定あちこち手を入れないとウゴカナカタよ。

それでも、バックエンドDBアクセスナシで700req/s
DB接続ありで200req/s行ける感触をつかんだので
かなり満足。

行き着く先はCでApacheモジュール化なのだが、そうすると
DBIのような統一インタフェイスが使えずDB依存になってしまうのが辛い。


上のカキコで PATH_INFO 云々の話が出てたが、ウチで試したときは
アクションハンドラとして呼ばれないときも
PATH_INFO=/
PATH_TRANSLATED=/path/to/www/ <- これファイルじゃネーし
とか出てきて少々面食らった。これはバグ? 実装上の都合?
0292nobodyさん03/12/28 05:05ID:???
しかし流行りませんなぁ。
0293nobodyさん04/02/03 03:55ID:6SsHdaLm
喚起あげ
0294nobodyさん04/02/10 21:22ID:YkFrJUBA
素朴な疑問なのですが、
mod_perl使ってる時にも通常のCGIとしてperlプログラム走るんですか?
0295nobodyさん04/02/10 22:35ID:???
ドテッ! ネタ?
0296nobodyさん04/02/11 14:36ID:???
Apache::PerlRunとApache::Registryどちらでも良いんだけど
HTML::Template使えますか。
0297nobodyさん04/02/11 17:34ID:8Wm4X/2a
mod_perl始めますた、ちょいと質問です。
皆さんは、

PerlSendHeader On

にしてますか?
mod_perlを使うなら Off だろ、とか、
漢なら Off にしとけ、とか、
なんかポリシーみたいなものってありますか?
0298nobodyさん04/02/11 19:17ID:???
   / ̄ ̄ ̄ ̄ ̄ ミ
  /   ,――――-ミ
 /  /  /   \ |
 |  /   ,(・) (・) |
  (6       つ  |
  |      ___  |   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
  |      /__/ /  <  mod_perlを使うなら Off だろ!
/|         /\   \__________
0299nobodyさん04/02/13 21:16ID:???
>>296
使える
0300nobodyさん04/02/14 12:13ID:???
C:\Program Files\Apache Group\Apache2\bin>apache -t
Syntax error on line 159 of C:/Program Files/Apache Group/Apache2/conf/httpd.conf:
Cannot load C:/Program Files/Apache Group/Apache2/modules/mod_perl.so into server: 指定さ
れたモジュールが見つかりません。

_| ̄|○ファイルあるのに…
0301nobodyさん04/02/14 12:46ID:???
mod_perlが流行らないのは、
やっぱ、スクリプトの制限がキツくなるからってことでおk?
0302nobodyさん04/02/14 13:15ID:???
Apache::PerlRun だとたいした制限は無いんだが

ISP屋の立場から言うと、suExecできないのが一番痛い
0303nobodyさん04/02/14 17:02ID:???
WinのApache2にmod_perl!?よくもまあ・・・
0304nobodyさん04/02/14 21:38ID:???
>>303
何が悪いのか教えれくらはい。
0305nobodyさん04/02/14 21:57ID:???
頭とセンスg(ry
0306nobodyさん04/02/16 00:45ID:???
>299
ってことはやり方が悪いという事かな……orz

>303
設計とかテストとかやるときはローカルのWin鯖でやってますが
UNIX版と違い出るんですか。
0307nobodyさん04/02/16 10:29ID:???
>>306 そもそもOSレベルで違うじゃん…
Windowsネイティブapache2のモジュールって拡張子.soだっけか?
0308nobodyさん04/02/16 12:42ID:???
スクリプトの書き方一緒じゃないの?
0309nobodyさん04/02/16 15:49ID:???
>>307
一応、soだよ

まあ、動くかどうかのテストはWinでもいいんじゃないかな
ベンチマークや負荷のテストは意味ないけど
0310nobodyさん04/02/16 16:28ID:???
apache と mod_perl って両方とも Winネイティブなんかな?
apache はwinネイティブで mod_perl が cygnus だったら 動かないとか。
もう少し詳しく書かないとなんとも言えないんじゃないかなぁ
0311nobodyさん04/02/16 16:37ID:???
「指定されたモジュールが見つかりません」の場合
ファイルは見つかっても何らかの原因でメモリへのロードに失敗している
というケースが実際にはほとんど

原因はバージョン不整合とかいろいろ考えられるが
まあ地道に切り分けるしかないな
0312nobodyさん04/02/16 16:53ID:1pUxS5fU
色々な所を参考にして mod_perl を組み込んで見ました。
そして以下のテストスクリプトを二種類の方法でちゃんと動作しているのですが、
CGIとして呼び出されてるのか、mod_perl として呼び出されているのかサッパリでして、、
確認する方法ってのはありますか?

## /home/user/perl/test
#!/usr/bin/perl -w
use strict;
print 'content-type: text/plain; charset=EUC-JP' . "\n";
print "\n";
print join("\n", map "$_ = $ENV{$_}", sort keys %ENV);

## httpd.conf
Alias /perl/ /home/user/perl/
Alias /cgi-bin/ /home/user/perl/
<Location /perl>
SetHandler perl-script
PerlHandler Apache::Registry
Options ExecCGI
PerlSendHeader On
</Location>

<Location /cgi-bin>
SetHandler cgi-script
Options ExecCGI
</Location>

http://hoge.com/perl/test -> OK.
http://hoge.com/cgi-bin/test -> OK.
0313nobodyさん04/02/16 17:44ID:???
思いつきだが、↓みたいなのでどうだ?

#!/usr/bin/perl -w
use strict;
print 'content-type: text/plain; charset=EUC-JP' . "\n";
print "\n";
print `ps aux | grep perl`;
0314nobodyさん04/02/16 17:55ID:???
>mod_perlで実行されている場合には、環境変数の $ENV{GATEWAY_INTERFACE} に
>'CGI-Perl/1.1' が設定されます。(通常CGIは 'CGI/1.1')
>また、'MOD_PERL' 環境変数が設定されます。(mod_perlのバージョンが設定される)
031531204/02/17 12:47ID:???
>>313-314
返事ありがとう。
早速試してみようと思ったんですが、
なんか電源が入らない、、orz、、bios すら起動しねーーーー

出直してきます。。(つд`;)
031631204/02/18 19:28ID:???
>>313-314
試して見ました。

## /perl/test
GATEWAY_INTERFACE = CGI-Perl/1.1
MOD_PERL = mod_perl/1.29

## /cgi-bin/test
GATEWAY_INTERFACE = CGI/1.1

問題なく動作しているようです、有難うございました。

ところで別の疑問なのですが、
CGI経由で動作している時には suEXEC で動作して欲しいと思って
suEXEC 有効にしてみました。

/perl/test -> nobody権限
/cgi-bin/test -> user権限

今の所正常に動作していると思うのですが、これって問題ない、、ですか?
どこのサイト見ても suEXEC は無効にしとけー、
てな事しか書いてなかったので少し不安なのです。
0317nobodyさん04/02/18 20:04ID:???
mod_perl で Apache::Registry、Apache:PerlRun で CGIスクリプトを実行すると、
mod_perlが組み込まれている httpd のプロセスの中で動いてしまうのでsuexecは効かない

CGI経由で別プロセスで動かすからこそsuexecが有効
0318nobodyさん04/02/29 04:50ID:yMfKis4M
http://dream.lib.net/room/cgi/download.html#link で公開されている Ranking link
というCGIを自サーバーで動作させたのですが、試してみると結構な確率で真っ白な画面が
ブラウザに表示されます。
このCGIは実績があるのでこのCGIのせいではなくて、mod_perlのせいなのだと思うのですが、
解決策が全くわかりません。 助けてください・・・。
環境は、
OS: Redhat 9.0
WebServer: Apache1.3.29
mod_perl version 1.29
perl 8.5.1
です。
OS以外は全てソースからコンパイルしてインストールしました。

0319nobodyさん04/02/29 05:49ID:???
mod_perlが使える鯖ってありますか?
0320nobodyさん04/02/29 07:26ID:???
ありません
0321nobodyさん04/02/29 11:32ID:???
>>318
助けてやりたいのはやまやまだが
318 に書かれた情報だけでは何とも手の差し伸べようがない

error_log に何が吐かれてるか確認する前に 318 を書いたのだとしたら
君の罪は麻原並に重い
0322nobodyさん04/02/29 11:34ID:???
>>318
こんなコーディングじゃ mod_perl は誤動作するのが当たり前田
0323nobodyさん04/02/29 11:41ID:???
>319
XREA
0324nobodyさん04/02/29 12:07ID:???
>318
眺めたところそのスクリプトのせいのような気が……。
032531804/02/29 15:21ID:yMfKis4M
>322
>324

どの辺りか教えて頂ければ幸いです・・。 お願い致します。

>321
エラーは一切吐かれていませんし、ブラウザで500番エラーが
表示されることもありません。




0326nobodyさん04/02/29 18:41ID:???
実績のあるプログラムだからといって、
mod_perl で動くかというとそうとは限らない。
0327nobodyさん04/02/29 21:39ID:???
KやRのはmod_perlではまともに動かんぞ。
0328nobodyさん04/03/01 06:28ID:???
正しくは、全Perlコードをパッケージで管理しなければ、
mod_perlでは、正しく動きません。または、高速動作できません。
0329nobodyさん04/03/01 10:01ID:???
Apache::PerlRun でもそうなの? > 要パッケージ管理
0330nobodyさん04/03/01 22:21ID:???
だからmod_perlは流行らない〜♪
0331nobodyさん04/03/02 21:16ID:O+pQat/o
ふぅ、やっとApache::ASPが動いたよ。
これってmod_perlだけじゃなく、
全てのモジュールをstaticで構成しないと駄目だったのね。

mod_perlだけだと思って何度も何度もやり直してしまいました。。
0332nobodyさん04/03/03 00:58ID:???
そういや何年か前、DSO のまま perl_ssi を作ろうとしてハマったことがあった
0333nobodyさん04/03/04 11:23ID:???
WinXP+Apache1.3.29にインストールしようと
ppm install http://theoryx5.uwinnipeg.ca/ppmpackages/mod_perl.ppd
としたんですが
Error: no suitable installation target found for package mod_perl
とエラーが出ます。どうしたものでしょう
0334nobodyさん04/03/05 19:12ID:GwB2WnjS
困りました。Apache-1.3.29 + mod_perl-1.29 + perl-5.6.1 の環境だったのを
perl-5.8.3 に変えて見ました。

mod_perlでスクリプトを出力すると
charset が間違っていないにも関わらず文字化けします。
どうやらutf-8で出力されているようなのですが、、

charset を utf-8 にすれば文字化けはしないのですが、
今度は CGI で実行した時に当然ですが文字化けします。

これは、、どうやって回避すればよいのでしょう。

## httpd.conf
<Location /perl>
SetHandler perl-script
PerlHandler Apache::Registry
Options ExecCGI
PerlSendHeader On
</Location>
<Location /cgi-bin>
SetHandler cgi-script
Options ExecCGI
</Location>

## script
my $euc = 'あいうえお';
print "content-type: text/plain; charset=EUC-JP\n\n";
print "$euc\n";
033533404/03/05 21:46ID:???
申し訳ありません。大ボケ噛ましておりました。
スクリプトが utf-8 でした。。。申し訳ありません。。
以下簡単にまとめました。

## script euc-jp
my $euc = 'あいうえお';
print "content-type: text/plain; charset=EUC-JP\n\n";
print "$euc\n";

/perl(mod_perl) も /cgi-bin(CGI) も問題無し。

## script utf-8
use utf8;
binmode(STDOUT, ':encoding(euc-jp)');
my $utf8 = 'あいうえお';
print "content-type: text/plain; charset=EUC-JP\n\n";
print "$utf8\n";

/perl(mod_perl)だと文字化け、charsetを utf-8 に変更すると問題なし
/cgi-bin(CGI) だと問題無し、charsetを utf-8 に変更すると文字化け

mod_perlの標準出力(STDOUT)は binmode では設定出来ない、のかな?
だとすると mod_perl の標準出力の文字コードを設定するにはどうすればよいのでしょう。

とりあえず euc-jp でスクリプトを書けば問題ない話なんですがちょっと↑が気になりました。
0336nobodyさん04/03/06 10:11ID:4ILBaJdh
The server encountered an internal error or misconfiguration and was unable to complete your request.
Please contact the server administrator, [email protected] .....
という文章がcgiを通して表示される最後に挿入されます・・・。
この文章を表示しないように設定したいのですが、httpd.confで
いじる場所もなさそうですし、どこを設定すればよいのでしょうか?
ご教授お願い致します。

0337nobodyさん04/03/06 10:22ID:???
スクリプト
0338nobodyさん04/03/07 01:19ID:???
>336
printした後の処理で実行時エラーが出てるとかのような。
0339nobodyさん04/03/07 18:30ID:???
まあまず error_log をチェックするのが正しい姿勢だろうな
0340nobodyさん04/03/09 05:55ID:???
Apache::Registry で qq で囲んだ文字に
エスケープ無しで " が入ってると実行時エラーが出た。
注意って事で。
0341nobodyさん04/03/09 22:03ID:???
qq"aaaaaaa"bbbbbbbb"cccccccc"

そりゃエラーになるよ
0342nobodyさん04/03/09 23:14ID:???
いや print qq(nantoka"kantoka"hontoka); でエラった。
0343nobodyさん04/03/14 20:00ID:???
ちょっと何が原因なのかわからなかくなったので、皆さんのお知恵を拝借したいです。

環境
Apache/2.0.40 (Red Hat Linux)
mod_perl/1.99_07-dev
perl, v5.8.0 built for i386-linux-thread-multi

A.pm------------
package A;
sub method1 {# hoge}
sub method2 {# hoge}
----------------
B.pm------------
package B;
use base qw ( A );
----------------
test.cgi----------
use B;
$o = B->new;
$o->method1;
$o->method2;
----------------
だいたいこんな感じ。

症状:
test.cgiの実行でこける。
エラーログを調べると、ModPerl::Registryさんが実行する度に「Bクラスにはmethod(1 or 2)はない」と違うことを言っている。
実際、ブラウザに状況を出力しながら動作確認をすると、確かにメソッド呼び出しのところでこけている。文法エラーでないことは途中までとは言えHTMLを吐き出していることからわかる。
なので、mod_perlさんのどこかに不具合があるのではないかと考えたのですが、そこまででした。
どんな原因が考えられますでしょうか。
034434304/03/14 20:48ID:???
間接的な原因が判明しました。
Apacheが古いバージョンのスクリプトでコンパイルした実行ファイルを、しっかり握って離していないだけでした。_| ̄|○
元ファイルを全部消しても、ブラウザでアクセスするとまだ結果が出るのです。
握りこんだ実行ファイルを手動で消す方法はないでしょうか。
0345nobodyさん04/03/14 21:14ID:???
Apache::Reload を使えばできるんじゃないかと思うが
自分でやってみたことはないので割と無責任
034634304/03/15 00:47ID:???
>>345
現在は、動作がおかしくなったらApacheのrestartと言うあまりクールでない手でやってます。

ありがとうございます。Apach::Reloadのmanを見てみます。
034733604/03/15 10:40ID:heuYMXtN
エラーログには [error] Undefined subroutine ?::handler called.
と出力されています。
なんじゃこのhandlerは??? 名前が無いです・・・。

ご教授お願い致します。
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 とは異なる原理に基づくローダを自作すれば、
理論的には不可能な話でも無いと考えられます。
■ このスレッドは過去ログ倉庫に格納されています