«前の日記(2004年07月22日) 最新 次の日記(2004年07月24日)» 編集

Matzにっき


2004年07月23日 [長年日記]

_ [Ruby]既存の CGI をそのまま FastCGI 対応に

既存のCGIプログラムの修正を最低限にしてFastCGI対応にする方法について。

以前、こんなトリックを書いたことがあります。

require 'cgi'
require 'fcgi.so'

class CGI
  class Fast<CGI
    CONTINUATION = []
    def Fast::new(*args)
      at_exit do
        if CONTINUATION[0]
          CONTINUATION[0].call
        end
      end
      callcc do |c|
        CONTINUATION[0] = c
      end
      fcgi = FCGI::accept
      unless fcgi
        CONTINUATION[0] = nil
        exit
      end
      $defout = fcgi.out
      super(*args)
    end
  end
end

「require 'cgi'」を「require 'fcgi'」に変更し、 「CGI.new」を「CGI::Fast.new」に書き換えるだけで かなりのCGIがそのまま動作するのではないかと思います。

もうちょっと手を加えれば、CGI.newのままでもいけるようにできるかな。

継続を使った数少ない実用的な例かも。


«前の日記(2004年07月22日) 最新 次の日記(2004年07月24日)» 編集