2009-12-29 121 views
4

我想在Haskell中創建Web應用程序(例如,它可能是博客,論壇或某些動態網頁),我需要什麼?如何使用Haskell編寫CGI腳本?

(我知道我需要一個HTTP服務器(如Apache或lighttpd的)。我也知道,我應該知道一些Haskell的編程。)

我如何得到這一切一起工作?我不明白整個軟件包/設置。

我是否需要mod_haskell或其他模塊?

請有人向我解釋apache模塊是如何工作的以及如何安裝它們?

+0

我並不想冒犯但是這已經寫了一遍又一遍在互聯網上。你想了解Haskell或如何構建服務器? – 2009-12-29 16:08:06

+0

不,我想要說明所有mod_somthing http-server和編程語言如何一起工作? 如何他們都連接在一起:-) – mono 2009-12-29 16:10:32

+0

摩西:你的問題是相當廣泛,而且可以通過多種方式來回答。例如,mod_php和mod_python模塊是* Apache *擴展模塊,因此它們可以與Apache堆棧協同工作。沒有我知道的mod_haskell。所有的網絡服務器(包括Apache)都支持通用網關接口(CGI),這也是做同樣事情的另一種方式,雖然CGI的性能特點可能會因您使用的語言而有很大不同。簡而言之:爲了獲得有用的答案,您需要將問題限制在一種語言或一個Web服務器上。 – 2009-12-29 16:27:41

回答

6

讓我們想象您正在使用您選擇的編程語言創建一個動態網站。

當用戶訪問您的網站時,他們向http://name-of-your-site.com發出請求,並將其傳遞到您的服務器。

當請求到達端口80時,它由您的HTTP服務器收集,該服務器可能是Apache,但可能是LightHttpd或任何其他HTTP服務器。這將收到請求並決定如何處理它。

現在想象你的站點是用python編寫的,它將作爲一堆.py文件存儲在某處,因此請求需要傳遞給python運行庫,並指示要運行的文件以及返回的位置該文件的輸出。這是mod_python的角色 - 從服務器獲取請求並將它們交給運行時。大多數mods也可以處理線程池 - 假設你一分鐘有20個請求,如果每個都以簡單的方式交給python運行時間,那麼你將有二十個python線程全部啓動,一起運行,然後隨着進程完成而死去。通常Apache mods會保留一些線程並運行,以節省啓動時間,並將新的請求傳遞給其中一個現有的線程,以便當完成一個請求時,它將通過接口傳遞給另一個線程。 CGI容器做一個性能稍微不同的方式同樣的工作,你可能會選擇一個比其他可能涉及到你所使用的HTTP服務器(mod_python的是專爲Apache的原因,例如,像FastCGI的使用更加有LightHttpd)和性能考慮。如果您正在使用類似FastCGI的東西,那麼您可能需要CGI容器和編程語言運行庫之間的第二層接口。

所以,你正在使用的層看起來有點像這樣:

HTTP Server-> CGI Layer   -> Programming Language Runtime -> your code 
Apache  -> mod_python   -> Python Runtime    -> index.py 
LightHttpd -> FastCGI+python_cgi -> Python Runtime    -> index.py 

很顯然,我已經使用Python作爲這裏的例子,但你可以找到最主流語言等同MODS和CGI容器(和很多深奧的)和你正在使用的Http堆棧在大多數情況下將大致相似。

+0

感謝很多人 它絕對有助於清除一些事情:-) – mono 2009-12-29 16:29:33

1

也許你會發現HAppS有用。

+2

HAppS是孤兒,你應該使用http:// happstack。 com而不是 – hiena 2009-12-29 16:11:34

5

對標題問題的簡短回答:是的。

http://hackage.haskell.org/package/cgi

Network.cgi

簡單庫編寫CGI程序。 CGI規範見 http://hoohoo.ncsa.uiuc.edu/cgi/interface.html

下面是一個簡單的例子,包括錯誤處理(不說,還有很多可以去 錯的Hello World)

import Network.CGI 

cgiMain :: CGI CGIResult 
cgiMain = output "Hello World!" 

main :: IO() 
main = runCGI (handleErrors cgiMain) 

關於零部件的一體化。

CGI是一個編程協議和Web服務器和一些外部程序之間的接口,通過標準輸入輸出和共享環境變量進行通信。

您需要一個支持CGI的Web服務器(大部分都是這樣),並且您必須配置服務器,以便對於某些特殊請求(例如具有特殊文件擴展名的URL),它會調用CGI程序。對於Apache Web服務器,請參閱http://httpd.apache.org/docs/2.0/howto/cgi.html

+0

感謝您的評論,但我不希望它與特定的語言。 我提到haskell,因爲它有點ezoteric :-)。 我想知道什麼是mod_somthing,http服務器和語言結合在一起。 :-) – mono 2009-12-29 16:22:22

+0

稍大一點的例子在這裏給出 都使網絡應用(博客,論壇,或只是動態網頁)的過程中,我不清楚:http://lukeplant.me.uk/blog/posts/ella/ – Long 2009-12-29 16:36:29

+0

@PA。在lighttpd的,我需要做下面的CGI:'[...] 「特等」=> 「的/ usr/bin中/ perl的」,」 [...]'但是我必須設置什麼可執行的名爲.hs文件? – 2016-04-28 08:20:06