Powered by SmartDoc

アプリケーションの高速化

mod_ruby

mod_rubyはApacheにRubyインタプリタを組み込むモジュールです。CGIKitアプリケーションでmod_rubyを利用するためにはちょっとした作業が必要になります。このほかmod_rubyの設定に合わせて起動スクリプトの拡張子を変更するなどしてください。

なお、mod_rubyへの対応は実験的機能です。安定して動作する保証はありません。

コンポーネントの名前空間を保護する

mod_rubyでは複数のスクリプトで1つのRubyインタプリタを共有するため、コンポーネントの名前空間を保護しないとCGIKitアプリケーションに影響が出ることがあります。そこで、CKApplicationのサブクラスを作ってコンポーネントの名前空間を保護します。

まず、起動スクリプトとは別にファイルを作成し、CKApplicationのサブクラスを定義します(起動スクリプトでこのファイルをロードします)。サブクラス名はアプリケーションに応じて変更してください。

class Application < CKApplication
end

次に、各コンポーネントをこのサブクラスの内部に定義します。

class Application
  class MainPage < CKComponent
    ...
  end
end

CKApplicationのサブクラスはmod_rubyの対応のみに限りません。CKApplicationオブジェクトはすべてのコンポーネント間で共有されるので、CKApplicationのサブクラスにアプリケーション全体に関係するメソッドをまとめておくと有用です。

アダプタをmod_rubyに変更する

CGIKitは「アダプタ」を使ってブラウザとデータ送受信を行います。通常CGIとmod_rubyのアダプタは自動的に判断されますが、それでも判断されないときやカスタマイズしたアダプタを使う場合は、CKApplication#interface属性でアダプタを指定してください。

#!/usr/local/bin/ruby

require ‘cgikit’
require ‘application’

app = Application.new
app.interface = CKAdapter::ModRuby
app.run

WEBrick

WEBrickはWebサーバ用のツールキットです。WEBrickでCGIKitを動かすには、アプリケーションのインスタンスを生成し、サーブレットとしてマウントします。

CGIKit用のハンドラは3種類あります。

ハンドラの種類
ハンドラ 説明
WEBrick::CGIKitServlet::PathHandler 第2引数にコンポーネントパスを定義するハンドラ
WEBrick::CGIKitServlet::HashHandler 第2引数に、ハッシュでCKApplicationへのアクセサを定義するハンドラ
WEBrick::CGIKitServlet::ApplicationHandler 第2引数にCKApplicationオブジェクトを渡すハンドラ

以下はApplicationHandlerを使った起動スクリプトです(付属サンプルのHelloWorldに添付してあります)。このスクリプトは、コンポーネントのパスとポート番号を指定して起動します。

% webrick-app.rb ‘.’ 8080

# webrick-app.rb [component_path [port]]
require 'webrick'
require 'cgikit'

path = ARGV.shift || Dir.pwd
port = (ARGV.shift || 8080).to_i

app = CKApplication.new
app.component_path = path

server = WEBrick::HTTPServer.new({:Port => port})
server.mount('/', WEBrick::CGIKitServlet::ApplicationHandler, app)

trap("INT"){ server.shutdown }
server.start