2006/12/19

用 Ruby 開發 Web 應用程式

哈哈...每天都寫一點學習心得,希望能用三(或更多)個月的時間學好這個語言。
其實標題打的太聳動了點,我還沒那麼厲害馬上學會開發大程式,
不過為了以後能夠玩的更有趣,先來試試如何讓 *.rb 給伺服器執行。

首先要裝 Ruby , *nix 似乎都已經是內建了,實在方便,Windows 就多裝一下應該沒有差。
再來挑個 Web 伺服器,我個人使用 Abyss Web Server X1,他小巧且支援 FastCGI 喔!
首先當然是加入腳本設定,將 *.rb 分給 C:\ruby\bin\ruby.exe 執行,這就是一般 CGI。
注意到 CGI 的輸出要正確,且開頭第一行也要注意 (跟 Perl 一樣啦)

#!/usr/bin/env ruby
puts "Content-Type: text/plain\n\n"


類似這樣的東西,這樣就可以指定輸出純文字格式,後續再看你要輸出什麼 HTML。

而聽說 Ruby 也有 FastCGI,找了一下發現了 ruby-cgi 這個包裹器,
前提要先安裝 fcgi 和 mmap 套件,怎麼試怎麼不成功,後來湊巧把 fcgi套件以純 Ruby 模式安裝上去了,
修改一下 fcgi.rb 前幾行 trap 的錯誤後,好像可以正常執行。 (require "fcgi" 成功)
不過這個 ruby-cgi 包裹器就不知道如何在 Windows 下掛上去,最後先暫時放棄。

發現了 Ruby 自身提供了一個 Web Server 叫做 WEBrick,執行之後即會建立一個 Web Server,
只要設定好 Server 要跑什麼,據說效能比直接 CGI 要快很多。
缺點是得使用獨立的 Web Server 實體和 Port,有點麻煩。我希望能跟 PHP 一樣直接用來執行。
以下就是範例,儲存成 hello.rb 後以 ruby hello.rb 執行即會產生 Web Server 實體。
使用 http://localhost:2000/hello 瀏覽。

#!/usr/local/ruby
require 'webrick'
include WEBrick
s = HTTPServer.new( :Port => 2000 )
class HelloServlet < HTTPServlet::AbstractServlet
def do_GET(req, res)
res.body = "hello, world."
res['Content-Type'] = "text/plain"
end
end
s.mount("/hello", HelloServlet)
trap("INT"){ s.shutdown }
s.start


最後既然 fcgi 好像裝好了,那也來試看看好了,不過感覺上跟 PHP 的 php-cgi 就不太一樣。
網路上的例子:

#!/usr/bin/ruby
require 'cgi'
require 'fcgi'
FCGI.each_cgi{|cgi| cgi.out{'hello, world.'}}


聽說這種模式下速度應該會有飛躍性的提升,可惜我試用 Apache 內建的 ab 來測試運作效率,
提升的並不明顯,可能還是沒設好包裹器的關係吧。

最後,來介紹大家線上學 Ruby,利用 AJAX 寫出來的 irb (Interactive Ruby)
Try Ruby!:http://tryruby.hobix.com/
也有線上教學,輸入 help 就可以一步步操作,感覺還不錯。

距離 RoR 還遠著咧...

沒有留言:

張貼留言