(前後の)リクエスト間で変数が保持されるのはなぜですか?
my() あるいは local() でスコープが設定されない限り、mod_perl の perl 変数はグローバルとみなされ、代入された値はあるリクエストから別なリクエストへと生き残るかもしれません。この現象は以下のような簡単なスクリプトでも観察できます。
<HTML><BODY>
<%
$counter++;
$Response->Write("<BR>カウンタ: $counter");
%>
</BODY></HTML>
$counter++の値は前後のリクエスト間で存続します。一般的にはグローバル変数をこのように使うのは(かなり)まずい考えであり、もし「 use strict 」に則った、つまり以下のようにグローバル変数の明示的な宣言を強要する perl プログラミングを実践すれば、頭痛に悩まされるのを何度も避けられるでしょう。
use vars qw($counter);
以下のように設定することで Apache::ASP スクリプトをすべて「 strict 」にすることができます。
PerlSetVar UseStrict 1
PerlHandler 命令で Apacheがエラーを出力するのですが?
mod_perl が
Apache 用に正しくインストールされていないためです。Apache の *.conf ファイル内の PerlHandler 命令は mod_perl によって拡張されるものであり、mod_perl が正しくインストールされていなければ動作しません。
ユーザがよく間違える点に、( perl に関する部分の) mod_perl をインストールするために 'make install' していないということと、構築したあとの正しい httpd を起動していないことが挙げられます。後者については、mod_perl を含まない旧バージョンの Apache サーバがシステム上に存在し、新しいバージョンの Apache サーバを構築した後に適切な箇所にコピーしていない場合によく起こります。
mod_perl は http://perl.apache.org からダウンロードできます。
Error: no request object (Apache=SCALAR(0x???????):) とは?
あなたのApache + mod_perl のビルドは適切に動作していません。そしておそらく RedHat Linux RPM DSO ビルドを利用していると思われます。かならず、Apache + mod_perl の httpd をソースから新しく静的に構築しましょう。
Tie や MLDBM / state でエラーメッセージがでます、どうしたら?
Web サーバ上の eg ディレクトリ、あるいは使用している config (ファイル)内で Global として指定されているディレクトリへの書き込み権限を所持していることを確認してください。Global のデフォルトは (e.g. '.') ですが、セキュリティを確保するため、公開するサイトではこれは WWW サーバのルートドキュメント下以外のディレクトリに設定するべきです。
通常は
chmod -R -0777 eg
を実行することにより、初期のテスト段階での書き込み権限に関する問題は解決されます。
書き込みアクセスに失敗するのが問題であれば Data::Dumper と MLDBM をバージョンアップしてみてください。これらは状態ファイルを書き込むためのモジュールです。
セッション
$Session を使って複雑なデータを保存するには?
これには細心の注意を払いましょう。
オブジェクトセクション内の $Session のドキュメントを読んでください。
$Session にはとても複雑なオブジェクトを保存できますが、その限界と利用するための構文は理解しておかねばなりません。
特に、以下のような、代入ステートメントの左辺に一段階以上の間接操作を含むものは避けましょう。
$Session->{complex}{object} = $data;
サーチエンジンがリンクを張り(スパイダー)、セッションマネージャを停止させてしまうのを防ぐには?
ウェブブラウザ以外の特定のスパイダーのようなエージェントに対してセッションを確立させないようにするには、初期化ハンドラが利用できます。
PerlInitHandler "sub { $_[0]->dir_config('NoState', 1) }"
これにより Apache::ASP が実行される前に環境設定が行われます。
このように、Apache::ASP をランタイムで設定する目的で
mod_perl API を利用できます。
「Insecure dependency in eval while running with - T switch」というエラーは何が原因ですか?
もし mod_perl を「 PerlTaintCheck On 」の設定で動作させているのであれば、「 Insecure dependency ... with - T switch 」というようなエラーが出るかも知れません。
セキュリティに大いに関心があるなら「 PerlTaintCheck On 」は推奨されます。
「 PerlTaintCeck On 」を指定することにより Apache::ASP は内部で自動的にデータから汚染(安全でない部分)を取り除きます。しかし $Session あるいは $Application などの状態オブジェクトを使用する場合は、Apache::ASP が内部で使っている MLDBM にもディスクから読み込まれたデータの汚染を取り除くように通知しなければなりません。それはこのような設定をすることで可能です。
$MLDBM::RemoveTaint = 1;
上記の行を global.asa の中のイベントハンドラの外に記入すればよいです。global.asa は単なる perl モジュールのようなものです。
$Session を用いて $dbh データベースハンドルを保存するには?
$dbh ハンドルを保存するのに $Session は使えません。これは IIS/NT を使用して来た方には変に思えるかも知れません。IIS/NT のシステムでは、ほとんど何でも $Session に保存できてしまいますが、この違いは要するにスレッドとプロセスの違いによるものです。
データベースハンドルはしばしば、リクエスト間で共有できないファイルハンドルをプロセスごとにオープンするので、$Session に $dbh データを保存していても、その他どの $dbh の初期化も、別の httpd プロセスにおいては、適合しません(関連性を持ちません)。
(しかし)全て無くなってしまうわけではありません! Apache::DBI はプロセスごとにデータベース接続をキャッシュするのに利用でき、大抵の場合大丈夫です。
開発
データベースへの接続はどう操作したらよいですか?
Database への接続は perl の DBI & DBD インタフェースを通して処理されます。
これ以上のことはhttp://www.symbolstone.org/technology/perl/DBI/を
参照してください。UNIX の世界ではほとんどのデータベースシステムが perl でクロスプラットフォームをサポートするようです。
DBD::ODBC はよく Win32 システムへの切符(うまく扱うための鍵)となります。
UNIX では OpeLink Software (http://www.openlinksw.com/)のような商業ベンダが ODBC 用の部品を提供しています。
Apache::DBIを使ってデータベース接続セッションをプロセスごとにキャッシングすることもできます。
ASP アプリケーションをデバッグするのに一番良い方法は?
perl 流なやりかたで ASP アプリケーションの開発とデバッグを簡単にする方法は
たくさんあります。
まずはAPIエクステンションである $Response->Debug() の内容や、
Debug 設定指令の内容を見ることで役立つヒントが得られるでしょう。
ファイルのアップロードはどう処理されるのですか?
CGI
の項を参照してください。
ファイルのアップロードは CGI.pm を通して実装されていて、
CGI.pm はこのためだけに動作中読み込まれます。
CGI.pm が Apache::ASP により読み込まれるのはこの時だけであり、
他の全ての CGI 用の機能は Apache::ASP 自体に備わっています。
なぜファイルのアップロードを実装していないかというと、
大容量のファイルアップロードを扱っているなら CGI.pm のために費される
100K のメモリ領域ぐらいは大したことはないだろうという考えからです。
ASP オブジェクトをアクセスする一般的な方法は?
以下の記法を用い、全てのASPオブジェクトはメインパッケージ経由で参照することができます。
$main::Response->Write("html output");
perl ではこの記法をどこでも使うことができ、
$Server->RegisterCleanup() により登録されたルーチン内でも使用可能です。
以下の記法はスクリプト、インクルードファイル、および global.asa 内で用います。
$Response->Write("html 出力");
ASP で print()は使えますか?
使えます。print() は $Response->Write() メソッドの別名なので、
ASP スクリプトのどこでも使えます。
Win32::ASP を使用する時 print() を使うことにより
PerlScript との移植性が保てます。
Do I have access to ActiveX objects?
Only under Win32 will developers have access to ActiveX objects through
the perl Win32::OLE interface. This will remain true until there
are free COM ports to the UNIX world. At this time, there is no ActiveX
for the UNIX world.
Can I script in VBScript or JScript ?
Yes, but not with this perl module. For ASP with other scripting
languages besides perl, you will need to go with a commercial vendor
in the UNIX world. ChiliSoft at http://www.chilisoft.com/ has one
such solution. Of course on NT, you get this for free with IIS.
Support and Production
How do I get things I want done?!
If you find a problem with the module, or would like a feature added,
please mail support, as listed in the SUPPORT section, and your
needs will be promptly and seriously considered, then implemented.
What is the state of Apache::ASP? Can I publish a web site on it?
Apache::ASP has been production ready since v.02. Work being done
on the module is on a per need basis, with the goal being to eventually
have the ASP API completed, with full portability to ActiveState PerlScript
and MKS PScript. If you can suggest any changes to facilitate these
goals, your comments are welcome.