既存の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のままでもいけるようにできるかな。
継続を使った数少ない実用的な例かも。