3

実用的なmod_perlから選択するいくつかの引用

「通常、1つのプロセスが終了する前に多くの要求を処理するため、各要求の処理の最後に何かを実行することが期待される場合、ENDブロックは使用できません。」

だから、私のa.cgiスクリプトでは:

my $flag = 1;

END {
    # Value for $flag is undefined, if this script is run under mod_perl. 
    # END block code only executed when process to handle a.cgi exit. 
    # I wish to execute some code, just before process to handle a.cgi exit.
    if ($flag) {
        # clean up code.
    }
}

この本は$r->register_cleanup(sub {#cleanup});を推奨しています。

でも、

  1. a.cgiスクリプトで$rを取得するにはどうすればよいですか?
  2. サブルーチンはmyscopeフラグ変数にアクセスできますか?
  3. この$r->register_cleanupはa.cgiスクリプトに配置されますか?クリーンアップコードをa.cgiスクリプトに対してのみ実行したい。残りではありません。
4

2 に答える 2

4
  1. 私の$r= Apache-> request;

  2. はい。ただし、ローカル変数と関数のスコープについては、http://modperlbook.org/html/6-2-Exposed-Apache-Registry-Secrets.htmlと次の数ページを参照してください。

  3. はい、実行したい場合にのみ関数を登録してください。

于 2009-06-26T04:52:37.310 に答える
1

私がこれを正しく理解していれば、mod_perlとプレーンCGIの両方で実行したいスクリプトがあり、これを行うためにApache::Registryを使用しているように聞こえます。

CGIスクリプトとして実行している場合にのみ実行するクリーンアップコードがあります。

mod_perlで実行しているかどうかを検出する必要があります。それはかなり簡単です。最も簡単な方法は、環境を確認することです。

unless ($ENV{MOD_PERL})
{
   #... cleanup code here.
}

スクリプトがApache::Registryで終了したときに何かを実行したい場合にのみ、クリーンアップハンドラーを登録します。

それが必要な場合は、クリーンアップコードをサブに配置し、CGIのチェックからそのサブを呼び出す必要があります。

unless ($ENV{MOD_PERL})
{
   cleanup_sub();
}

クリーンアップハンドラーから:

my $r = Apache->request;
$r->register_cleanup(sub { cleanup_sub() } );
于 2009-06-26T10:43:41.970 に答える