1

長期実行プロセスのために mod_perl2 インスタンスに触れる必要がある内部サービスを作成しています。ジョブは HTTP POST から起動され、mod_perl ハンドラーがそれを取得して作業を行います。長い時間がかかる可能性があり、非同期で処理する準備ができているため、実行中に HTTP 接続を終了できることを望んでいました。

PHP には関数がありignore_user_abort()、適切なヘッダーと組み合わせると、プロセスを実行したまま HTTP 接続を早期に閉じることができます (この手法については、ここで SO で数回言及されています)。

Perlには同等のものがありますか? 私はまだ1つを見つけることができませんでした。

4

2 に答える 2

3

わかりました、私はそれを理解しました。

Mod_perl には、ここで PHP の「反対」の問題があります。デフォルトでは、接続が中止されても mod_perl プロセスは開いたままになり、PHP はデフォルトでプロセスを閉じます。

Practical mod_perl bookには、中止された接続を処理する方法が 記載されています。

(ところで、この特定の問題の目的のために、ジョブキューは「切断中」のhttpプロセスよりもリストの下位にありました)

#setup headers
$r->content_type('text/html');
$s = some_sub_returns_string();

$r->connection->keepalive(Apache2::Const::CONN_CLOSE);
$r->headers_out()->{'Content-Length'} = length($s);

$r->print($s);
$r->rflush();

#
# !!! at this point, the connection will close to the client
#

#do long running stuff
do_long_running_sub();
于 2009-07-06T17:32:13.847 に答える
0

これには、ジョブ キューの使用を検討することをお勧めします。これは、バックグラウンド処理ジョブを開始できる Zend から提供されたものですphp と perl には、これらの選択肢がいくつかあるはずです。

この問題について話している別のスレッドと、いくつかの php オプションに関する記事があります。私は perl 修道士ではないので、これらのツールに関する提案は他の人に任せます。

于 2009-07-06T17:05:20.157 に答える