ホーム  |  製品 & サービス   |  サポート & ダウンロード  |  開発者向け情報  |  お問い合わせ
人生に地図はない
fastcgi を lisp で使う

apach 2.4 の mod_proxy_fcgi を使うのがよい。以下の情報は apach 2.2 の時の情報なので古い。clisp より sbcl を使った方がよい(だろう)。ただし sbcl は標準で fastcgi に対応していない。

ためしに common lisp で fastcgi に対応してみた

次のモジュールを ports からインストール

  • ghoststript-gpl-nox11
  • clisp

FastCGI の設定 は FastCGI と apache22 に以前書いた

あとは fcgi を書くだけ。 サンプルの test.fcgi

#!/usr/local/bin/clisp -q -K full

(defun newline () (format nil "~%"))
(do ((count 1 (1+ count)))
((not (fastcgi:accept)) nil)

(fastcgi:out "Content-type: text/plain" (newline) (newline))
(fastcgi:out
"I am running in mode: " (if (fastcgi:is-cgi) "CGI" "FastCGI") (newline)
"This is execution No.: " count (newline)
"The browser string is '" (fastcgi:getenv "HTTP_USER_AGENT") "'" (newline))

(fastcgi:finish))

の扱いには注意が必要だった。clisp では漢字は 1文字。長さも1。しかし fastcgi:out が byte に変換して出力してしまうため、文字長がうまくあわなかった。仕方がないので fastcgi.lisp にパッチを当てた。現在は euc-jp 決め打ち。エンコード用のルーチンをちゃんと書けば動きそう

キャッシュされる

apache の設定で

FastCGIConfig -autoUpdate

とすればいいことが判明。

lisp プロセス

さて、どうやら clisp の FastCGI はプロセスを起動してそこにコンテキストを保存するようだ。こんなかんじ

> ps -ax | grep lisp
28806 ?? I 0:00.02 /usr/local/lib/clisp/full/lisp.run -B /usr/local/lib/

コンテキストをプロセスが保存しているので、上のようなスクリプトを実行すると count という変数をずーと保存していてくれます。ちゃんとカウンタになる。