手順メモ

デフォルトの設定(/usr/local/godi/etc/ocsigen.conf)では実行userやTCPポート番号辺りを適当に弄ったら動いたので、今度は自分で準備してみる。

  • まずはサンプルアプリを用意(examples/tutoeliom.mlのcountを抜き出しただけ)。
open Lwt
open XHTML.M
open Eliom_services
open Eliom_parameters
open Eliom_sessions
open Eliom_predefmod.Xhtml

let count =
  let next =
    let c = ref 0 in
      (fun () -> c := !c + 1; !c)
  in
  register_new_service
    ~path:["count"]
    ~get_params:unit
    (fun _ () () ->
      return
        (html
         (head (title (pcdata "counter")) [])
         (body [p [pcdata (string_of_int (next ()))]])))
ocamlfind c -thread -c -package ocsigen count.ml
  • 設定ファイルはこんな感じ。
<ocsigen>
  <server>
    <port>*:8888</port>
    <logdir>/home/mitsu/ocsigen/hoge/log</logdir>
    <datadir>/home/mitsu/ocsigen/hoge/data</datadir>
    <user>mitsu</user>
    <group>wheel</group>
    <charset>utf-8</charset>
    <findlib path="/usr/local/godi/lib/ocsigen/METAS"/>
    <extension findlib-package="ocsigen_ext.ocsipersist-sqlite"/>
    <extension findlib-package="ocsigen_ext.eliom"/>
    <host>
      <eliom module="/home/mitsu/ocsigen/hoge/app/count/count.cmo"/>
    </host>
  </server>
</ocsigen>
  • ocsigen始動。
$ ocsigen -c config/ocsigen.conf
  • Webブラウザでアクセスした際のHTTPヘッダー
GET /count HTTP/1.1
Host: 192.168.0.5:8888
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.0.1) Gecko/2008070208 Firefox/3.0.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ja,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Cookie: mycookie=47
Pragma: no-cache
Cache-Control: no-cache

HTTP/1.x 200 OK
Accept-Ranges: none
Cache-Control: no-cache
Content-Type: text/html; charset=utf-8
Date: Mon, 15 Sep 2008 08:09:40 GMT
Expires: 0
Server: Ocsigen
Transfer-Encoding: chunked
  • ボディ部。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<!-- Page generated by OCaml with Ocsigen.
See http://www.ocsigen.org and http://caml.inria.fr for information -->

<html>
  <head>
    <style type="text/css">
.eliom_inline {display: inline}
.eliom_nodisplay {display: none}
</style>
    <title>counter</title>
  </head>
  <body>
    <p>1</p>
  </body>
</html>

アクセスする度にpタグで囲まれた数値がインクリメントされていく。セッションも使ってないんだよねぇ。関数nextの状態がメモリ上に保持されていて、アクセスされる度に評価されるみたい。まぁ、普通のCGIみたく毎回プロセスが作られる場合だと出来ない芸当だけど、SpeedyCGIとかプロセスが常駐するパターンだと同様のことは出来ると思う。

とりあえず、もうちょっと弄くってみたいと思います。