perlメモ:cgiをなるべく早く終了させるには

cgiの負荷対策として、プログラムの処理が終了したら、さっさとコネクションを切断して、プロセスを終了させたい。特に同時起動プロセス数が制限されている共用レンタルサーバーではなおさらだ。sshやtelnetでサーバーに接続してプロセスをTOPコマンドやPSコマンドで覗く事ができる場合、掲示板などのCGIが結構長く居座っていたりするのを見ることがある。できることであればさっさと終了してもらいたい。何でいつまでもいるのだろうかと思うことはないだろうか?

cgiに接続しているユーザーの環境によっていつまでもコネクションが切れずにcgiが起動しっぱなしになっている事も考えられる。

そういう場合、下記の記事の内容が役に立つかもしれない。

sleepを使用した場合 [Archive] – XREA&CORE SUPPORT BOARD
http://sb.xrea.com/archive/index.php/t-6952.html

つまりclose(STDOUT)で標準出力をクローズするとその時点でブラウザとのコネクションが切れる。その時点でプロセスが終了するわけではないが早く切断できれば早くプロセスが終了することに繋がると思う。

バッファリング制御についてもふれられている。

$| = 0; バッファリング有効(default)
$| = 1; 0以外の値でバッファリング無効

 

バッファリングとは改行コードがくるまで出力を溜め込んでいて改行コードが来たらバッファの内容を一気に出力する仕組み出力命令毎に出力していたらI/O的に無駄が多いので搭載されている仕組み。

バッファリング時とバッファリング無効時の動作の違いを比べるには下記のプログラムを実行してみるとよくわかる。

   1:  #出力のバファファリングを無効化
   2:  $| = 1;
   3:   
   4:  for($i=0; $i<5; $i++){
   5:      print $i;
   6:      sleep(1);
   7:  }
   8:  print "\n";
   9:   
  10:   
  11:  #出力のバファファリングを有効化
  12:  $| = 0;
  13:   
  14:  for($i=0; $i<5; $i++){
  15:      print $i;
  16:      sleep(1);
  17:  }
  18:  print "\n";

 

close(STDOUT);で無理やりコネクションを切断するのでバッファにデータが残っているとその部分が欠落してしまうので、バッファリングを無効にしておく必要がある。

 

タグ :