2009-07-06 12 views
1

私は、長期実行プロセスのためにmod_perl2インスタンスに触れる必要のある内部サービスを作成しています。ジョブはHTTP POSTから起動され、mod_perlハンドラがそれを取り出して処理します。それは長い時間がかかり、非同期で処理する準備ができているので、HTTP接続が実行されている間にHTTP接続を終了できることを期待していました。PHPのignore_user_abort()に相当するmod_perl2/Perl 5はありますか?

PHPには右のヘッダと組み合わされると、プロセスを実行しながら早期にHTTP接続を閉じることができるという機能があります(このテクニックはここではあと数回述べます)。

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

答えて

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(); 
0

このためにジョブキューを使用することをお勧めします。バックグラウンド処理ジョブを開始させるZendが提供するoneです。 phpとperlにはいくつかのものがあります。

ここにはthisの問題とarticleに関するいくつかのphpオプションについて説明しているスレッドがあります。私はperlの修道士ではないので、私はそれらのツールに関する提案を他の人に残しておきます。

関連する問題