バックグラウンドで処理を行うCGIを作成する

2005/06/25 更新

CGIを用いたWEBアプリケーションを構築しているとき、CGI中で時間のかかる処理を行わせると、処理が終了するまで利用者は待たされてしまいます。 このような場合は、子プロセスを生成し、子プロセスに重い処理を行わせればいいのです。 ただし、子プロセスの標準入力、標準出力、標準エラーをクローズしないと、子プロセスが終了するまで、クライアント側が読み込み状態のまま待機してしまうので注意が必要です。

下記はサンプルコードです。 Apache1.3とperl5の組合せで動作を確認しました。 なお、Linuxの場合は、親プロセスが存在しないプロセスがゾンビになった場合、initが親プロセス代わって処理してくれます。そのため、サンプルコードではwaitを行っていません。

# forkする
my $pid = fork;

# forkが失敗した場合はエラー処理を行う
unless (defined $pid) {
    die "fork faild.";
}

if ($pid > 0) {
    # 親プロセスです。
    
    # HTML文章を出力します。

} else {
    # 子プロセスです。

    # 標準入力、標準出力、標準エラーをクローズします。
    close(STDIN);
    close(STDOUT);
    close(STDERR);

    # 重い処理を行います。
}
exit(0);

Copyright (C) 2005 Nabe, All right reserved.