投稿日:2006年03月08日 作成鷹の巣

No.20304 Fedora+Apache2.0.54(2.0.55)の環境下でPAR圧縮のCGIが表示されない



Fedora+Apache2.0.54(2.0.55)の環境下でPAR圧縮のCGIが表示されない

No.20304 投稿時間:2006年03月08日(Wed) 16:20 投稿者名:ふぁる URL:

はじめまして、ふぁるともうします。よろしくお願いします。

表題の環境下でCGIを作成しております。Apacheのバージョンは2個試してみて両方とも同じ結果でございました。

以下の様なCGIを作成し、
CGI
====================ここから
#!/usr/bin/perl --
use PAR;
use CGI;
use strict;
my $data = new CGI;

print $data->header(-Content => "text/html");
print STDOUT "test";


1;
====================ここまで
を作成し、
コマンド
pp -o test2.cgi test.cgi
でバイナリ化し実行しようとしております。

バイナリ化する前のtest.cgiはブラウザからの呼び出しで期待通りの動作をしますが、
バイナリ化したtest2.cgiの実行を行うと、
ブラウザにはInternalServerError
アパッチのエラーログには
[Wed Mar 08 15:50:53 2006] [error] [client xxx.xxx.xxx.xxx] Premature end of script headers: test2.cgi
となります。

業務上バイナリ化での利用となるので、バイナリ化で正常動作をするようにするにはどのようにしたらよろしいでしょうか?


参考までに、CGIを動作させようとしているディレクトリには
AddHandler cgi-script .cgi
の設定になっております。


出来上がったtest2.cgi には実行権限がありますか。

No.20305 投稿時間:2006年03月08日(Wed) 19:59 投稿者名:ふぁらだ URL:

> はじめまして、ふぁるともうします。よろしくお願いします。
>
> 表題の環境下でCGIを作成しております。Apacheのバージョンは2個試してみて両方とも同じ結果でございました。
>
> 以下の様なCGIを作成し、
> CGI
> ====================ここから
> #!/usr/bin/perl --
> use PAR;
> use CGI;
> use strict;
> my $data = new CGI;
>
> print $data->header(-Content => "text/html");
> print STDOUT "test";
>
>
> 1;
> ====================ここまで
> を作成し、
> コマンド
> pp -o test2.cgi test.cgi
> でバイナリ化し実行しようとしております。
>
> バイナリ化する前のtest.cgiはブラウザからの呼び出しで期待通りの動作をしますが、
> バイナリ化したtest2.cgiの実行を行うと、
> ブラウザにはInternalServerError
> アパッチのエラーログには
> [Wed Mar 08 15:50:53 2006] [error] [client xxx.xxx.xxx.xxx] Premature end of script headers: test2.cgi
> となります。
>
> 業務上バイナリ化での利用となるので、バイナリ化で正常動作をするようにするにはどのようにしたらよろしいでしょうか?
>
>
> 参考までに、CGIを動作させようとしているディレクトリには
> AddHandler cgi-script .cgi
> の設定になっております。

ppと言うのは使ったことが無いです。くぐって見ると特にコンパイルするようなものではないみたい。
コンパイルだとperlcc が有名ですがそちらは試されていないかな。


出来上がったtest2.cgi には実行権限がありますか。test.cgiと同じですか?
./test.cgi 実行と
./test2.cgi 実行では同じ表示をしますか?


実行ユーザをApacheの実行ユーザとおなじものに変更しても症状は同じでした。

No.20307 投稿時間:2006年03月09日(Thu) 10:15 投稿者名:ふぁる URL:

ご回答ありがとうございます。

ppはPerlCCの機能が上がったもののようです。
実際にCPANにそのようなことがかいてありました。

perldoc.jp/docs/modules/PAR-0.75/script/pp.podより
引用===========ここから
ppは、Perlのプログラムからスタンドアローンな実行可能ファイルを作成する。これはPARによって提供される圧縮されたパッケージャーと、 Module::ScanDepsによって提供される依存関係発見方法を利用している。ソースファイルはコンパイル無しに逐語的に圧縮される。

You may think of pp as "perlcc that works without hassle". :-)

あなたはppのことを"混乱せずに動くperlcc"と思うかもしれないが(笑)
引用===========ここまで


>
> ppと言うのは使ったことが無いです。くぐって見ると特にコンパイルするようなものではないみたい。
> コンパイルだとperlcc が有名ですがそちらは試されていないかな。
>
>
> 出来上がったtest2.cgi には実行権限がありますか。test.cgiと同じですか?
> ./test.cgi 実行と
> ./test2.cgi 実行では同じ表示をしますか?

各CGIの権限ですが、両方とも755でコマンドライン上で実行すると
./test.cgi、./test2.cgiともにコンソールに何も返さず終了。
また
perl ./test.cgi
だと

Content: text/html
Content-Type: text/html; charset=ISO-8859-1

test
の表示

perl ./test2.cgi
だと
Unrecognized character \x7F at ./test2.cgi line 1.
と、なりエラー終了。

ちなみにtest2のほうの実行ユーザをApacheの実行ユーザとおなじものに変更しても症状は同じでした。


誤解

No.20308 投稿時間:2006年03月09日(Thu) 22:35 投稿者名:Iwa URL:http://www.ethersky-online.net/

誤解されていますね。

> ppはPerlCCの機能が上がったもののようです。

まったく違います。
perlccはPerl言語で書かれたスクリプトをC言語に変換するもの。
ppはPARでPerl言語で書かれたスクリプトをPerlインタープリタと一緒にZIPで圧縮してパッケージにするものです。
ですので、PARでPerlスクリプトをバイナリにしているというのは実は語弊があります。
パッケージにされたものをZIPが解凍可能なアーカイバソフトで展開してみると、元のPerlスクリプトがそのまま入っています。
実行時にはこの展開したスクリプトとインタープリタを使ってPerlスクリプトを動かします。
ですので、純粋に実行するときよりもPARでパッケージにしたものの方が負担が増え、またスピードも遅くなります。

> perl ./test2.cgi

PARでパッケージにしたものは、あくまで圧縮したファイルです。
それをperlコンパイラの引数につけて実行しようとしても動かないのは当然です。

PARでパッケージにしたものは、Perlの環境が無いマシンでPerlスクリプトを使いたいという場合に使用するものです。

参考(3番目の私の回答)
http://www.hatena.ne.jp/1107009118


誤解も解けすっきりといたしました。

No.20310 投稿時間:2006年03月10日(Fri) 10:52 投稿者名:ふぁる URL:

ありがとうございました。
誤解も解けすっきりといたしました。


目次掲示板過去ログ目次▲頁先頭