知識
不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價值,我們在追求其視覺表現(xiàn)的同時,更側(cè)重于功能的便捷,營銷的便利,運營的高效,讓網(wǎng)站成為營銷工具,讓軟件能切實提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序為后期升級提供便捷的支持!
您當(dāng)前位置>首頁 » 新聞資訊 » 網(wǎng)站建設(shè) >
Erlang 與 Web 開發(fā)
發(fā)表時間:2008-12-7
發(fā)布人:葵宇科技
瀏覽次數(shù):70
Erlang 語言的很多特性,決定了它開發(fā)服務(wù)器端(Server)的程序極其地方便,故此,基于 Erlang 的各種服務(wù)應(yīng)用正雨后春筍般涌現(xiàn)。這里我們就大家最熟悉的 Web 開發(fā)展開話題??紤]到 Erlang 并不廣為人知,這里以脫盲為主,如果某個話題引起你的興趣,建議你參考相關(guān)文檔繼續(xù)深入下去。有任何希望討論的地方,可以在 erlang-china 或 ecug 這兩個 google groups 中討論。本文重點介紹的是 Yaws 和 MochiWeb,其他內(nèi)容做概要介紹。
Erlang
編譯與安裝
- 下載 Erlang
wget http://erlang.org/download/otp_src_R12B-2.tar.gz
- 安裝 bison, flex, openssl, ncurses
sudo apt-get install bison
sudo apt-get install flex
sudo apt-get install libssl-dev
sudo apt-get install ncurses-dev
- 編譯 erlang/otp
tar zxvf otp_src_R12B-2.tar.gz
cd otp_src_R12B-2
./configure
sudo make install
Inets httpd
之所以首先介紹 Inets httpd 服務(wù)器,是因為這是 Erlang OTP 自帶的 Web Server。我們知道 Erlang OTP 是一個平臺,而不止是一個語言。它帶有很多管理用的小工具,多數(shù)情況下這些工具以 Web 方式提供。而這些工具通常是基于 Inets httpd 的。
用Inets httpd你會覺得和Apache有點象。確實如此。我曾經(jīng)寫了一篇文章介紹 Inets httpd,這里不在重復(fù),欲了解請參閱:http://erlana.googlecode.com/svn/trunk/doc/Erlang%20Inets/。
Yaws
Yaws(http://yaws.hyber.org/)是目前通 用 Erlang Web Server 中最為名聲顯赫的一個,也是文檔最為豐富的一個。Yaws 本身帶的文檔和樣例都很詳細(xì),我這里另辟蹊徑,將 Yaws 和我們通常所說的 LAMP (Linux + Apache + MySQL + PHP)作為比照,來一個 LYMP (Linux + Yaws + MySQL + PHP)開發(fā)。
需要說明的是,LYMP 并不是 Yaws 最為推崇的開發(fā)模式,只是因為它是大家最為熟悉的一條路子。其實 Yaws 本身和 Inets httpd 一樣的思路,它傾向于一切都使用 Erlang 語言,即 LYME(Linux + Yaws + Mnesia + ErlScript)開發(fā):用 Yaws 做 Web Server,用 Erlang Script(*.yaws)寫頁面,用 Mnesia 來做數(shù)據(jù)存儲。LYME 雖然和 LYMP 只差一個字母,但是此 M 非彼 M,兩者大相徑庭。
編譯與安裝
- 下載 yaws, openpam
wget http://yaws.hyber.org/download/yaws-1.77.tar.gz
wget http://nchc.dl.sourceforge.net/sourceforge/openpam/openpam-20071221.tar.gz
- 編譯/安裝 openpam
tar zxvf openpam-20071221.tar.gz
cd openpam-20071221
./configure
sudo make install
- 編譯/安裝 yaws
tar zxvf yaws-1.77.tar.gz
cd yaws-1.77
vi c_src/epam.c,修改其中的 #include <pam_appl.h> 為 #include <security/pam_appl.h>
./configure
sudo make install
Yaws + PHP
- 安裝php cgi
sudo apt-get install php5-cgi
- 修改Yaws配置(sudo vi /usr/local/etc/yaws.conf)
php_exe_path = /usr/bin/php-cgi #加入這行,為了讓yaws找到php
...
<server xxxx>
port = 80
listen = 0.0.0.0
allowed_scripts = php yaws cgi #加入這行,以便在該虛擬主機(server)中啟用php cgi
....
</server>
- 測試PHP支持:在 /usr/local/var/yaws/www 目錄下,創(chuàng)建 test.php,內(nèi)容如下:
<?php
echo "Hello, PHP!/n";
?>
- 啟動Yaws(命令行:sudo yaws -i),然后在瀏覽器地址欄輸入 http://127.0.0.1/test.php,如果顯示"Hello,PHP",那么恭喜你,你已經(jīng)可以在 Yaws 這個Web服務(wù)器下寫 PHP 了。
LYMP: Linux + Yaws + MySQL + PHP
有了PHP的支持,剩下來的問題可能是數(shù)據(jù)庫(Database)了。但其實這個問題和Yaws關(guān)系不大。只要你安裝了MySQL,并且PHP安裝了MySQL擴(kuò)展,就可以用 LYMP 進(jìn)行 Web 開發(fā)了。
LYME v.s. LYMP
LYMP 優(yōu)勢:和大家熟悉的 LAMP 最接近,而且可以無縫切換。Web Server 是 Yaws,還是 Apache,或者是甚至是 IIS? 基本不會對我們的開發(fā)產(chǎn)生太多的影響。而劣勢是,Erlang 的優(yōu)勢在這里的體現(xiàn)并不明朗。因為一般 Web 服務(wù)器的瓶頸主要在數(shù)據(jù)庫(Database)上,前端的 Web Server 就算有瓶頸,一般也用負(fù)載均衡(LB)搞定,看起來不需要動用 Erlang。
LYME優(yōu)勢:壓力最重的數(shù)據(jù)庫使用 Mnesia 這個分布式數(shù)據(jù)庫來降低成為熱點的可能性(當(dāng)然具體還是會取決于你的設(shè)計)。而劣勢是,對傳統(tǒng)的 Web 開發(fā)人員而言,所有的東西都是新的,學(xué)習(xí)的成本過高。
ErlyWeb
ErlyWeb(http://code.google.com/p/erlyweb/) 基于 Yaws,但是它傾向于 Linux + Yaws + MySQL + ErlTL 開發(fā)。也就是說,數(shù)據(jù)庫用傳統(tǒng)的 MySQL,其他用 Erlang 進(jìn)行開發(fā)。ErlyWeb 的作者對 Erlang 的興致很高,主導(dǎo)了多個 Erlang 開源項目。而最引入矚目的一個,可能要算 twoorl (http://code.google.com/p/twoorl/): 它是一個開源的仿 Twitter 程序,并且是一個很好的基于 ErlyWeb 的樣例。
MochiWeb
MochiWeb 是 MochiBot.com 公司的 Bob Ippolito 貢獻(xiàn)的開源項目。 MochiBot.com 提供 Flash 內(nèi)容的訪問統(tǒng)計和用戶跟蹤服務(wù)(你可以理解為這是針對 Flash 的 Google Analytics 服務(wù)),它們在 MochiWeb 之上構(gòu)建了一個定制化的 Web Server,并通過這個 Web Server 獲取用戶的訪問數(shù)據(jù)(在這一點上有點象我發(fā)起的 Erlana 項目)。由于 Analytics 服務(wù)的特殊性,你可以想象,這個 Web Server 需要很高的并發(fā)支持。 MochiWeb 因此應(yīng)運而生。 它針對的不是大家普遍意義上理解的 Web 開發(fā)。和傳統(tǒng)的 LAMP 很不一樣,你甚至可以不把它看作一個 Web Server,因為它幾乎沒有任何 Web 開發(fā)所有常用的基礎(chǔ)設(shè)施。
但是 MochiWeb 最大賣點是非常輕量(高并發(fā))而靈巧(易于定制),在特殊的場景下非常有用。目前 MochiWeb 已知的或者可以預(yù)見的應(yīng)用包括:
- Facebook 的 Web Chat(http://yoan.dosimple.ch/blog/2008/05/15/)
- CouchDB(http://www.javaeye.com/news/459)
- Erlana: Web Analytics服務(wù)(http://code.google.com/p/erlana/)
- XXX Open Web API(RESTful): 為了提供Web API,你沒有必要為此搭建一個通常意義的 Web Server。
Comet Programming: Web Chat
Comet 是一項很時髦的技術(shù)。其目的很簡單:由于歷史原因,目前 HTTP 協(xié)議信息都是客戶端向服務(wù)器要(Poll),服務(wù)器沒有辦法推送信息給客戶端(Sever Push)。這在實現(xiàn)某些應(yīng)用的時候就會遇到麻煩。例如:
- 當(dāng)郵件服務(wù)器收到新的郵件時,及時報告給用戶,如果他在線的話(GMail 這樣做了)
- 當(dāng) Web Chat 服務(wù)器收到新的信息時,及時發(fā)送信息到相應(yīng)的在線用戶(Web Chat 的基本需求)。
- 聊天時提示你對方正在輸入(時下 IM 客戶端很時髦的一個功能)。
這里讓我們假想要做一個 Web Chat。一個最笨的方法,就是客戶端隔一段時間就向服務(wù)器請求(Request)一次,看看有沒有新的信息,如果有則取回新信息,沒有那么這次的請求就浪費了。這個方法無端增加了網(wǎng)絡(luò)流量和服務(wù)器的負(fù)荷,顯然并不可取。
那么 Comet 是如何做的呢? 有兩種實現(xiàn)方式,一種叫 Streaming,一種叫 Long Polling。這里我們介紹后者。簡單來說,Long Polling 就是客戶在初始化的時候向服務(wù)器發(fā)送一個請求(建立連接),該請求到服務(wù)器那里后被阻塞,直到有事件發(fā)生后才返回,客戶端在獲得事件并處理后,再重新建立 一個新連接,如此反復(fù)。由于請求在沒有事件的時候并不馬上返回,這就大大減少了網(wǎng)絡(luò)流量。當(dāng)然這里有個細(xì)節(jié),就是超時處理。因為現(xiàn)在路由器和防火墻都會自 動斷開時間比較長的連接。關(guān)于 Comet 技術(shù)更多的消息,可以參閱 http://cometdaily.com/。
Comet 技術(shù)對服務(wù)端的要求還是很高的,Long Polling減少了網(wǎng)絡(luò)流量,但是服務(wù)端的連接數(shù)并沒有減少。因此基于 Comet 的應(yīng)用,很容易在 Scale(伸縮性)上出現(xiàn)問題。使用 Erlang + MochiWeb,還是很好的利用了 Erlang 可以輕松建立大量連接這個特性。需要指出的是,很可能 Comet 應(yīng)用的時髦,將會很大程度上促進(jìn)了業(yè)界對 Erlang 的關(guān)注。
基于 Erlang 的 Web Chat,Facebook 做了一個。這里有網(wǎng)上某人對 Facebook 之 Web Chat 的“模仿版”。研究這個 Web Chat,你將更清晰如何進(jìn)行 Comet 編程:
下載并編譯MochiWeb
svn co http://mochiweb.googlecode.com/svn/trunk mochiweb #取得mochiweb源碼
cd mochiweb
make
MOCHIWEB=`pwd`
Minimal Web Chat
wget http://yoan.dosimple.ch/blog/2008/05/15/chat.tgz
tar zxvf chat.tgz
cd chat/deps
ln -s -f $MOCHIWEB mochiweb-src
cd ..
make
./start.sh
這樣,在 http://localhost:8000/ 就啟動了一個 WebChat Server。你可以從多臺機器連接該 Server進(jìn)行聊天。
Template Engine for Erlang
雖然 Erlang 和傳統(tǒng)的 Web 開發(fā)模式是可以結(jié)合的(如上面的 LYMP),但是多數(shù)基于 Erlang 的開發(fā)似乎并不打算這樣做。既然已經(jīng)用了 Erlang,一個純的 Erlang 應(yīng)用也許是個更不錯的主意。但是既然傾向于用 Erlang 取代 PHP/JSP 來作為腳本引擎,那么基于 Erlang 的 Template Engine(模板引擎)就少不了了。目前基于 Erlang 的主要 Template Engine 如下:
- ErlTL(http://code.google.com/p/erlyweb/):是 ErlyWeb 作者專門為 Erlang Web 開發(fā)制作的模板引擎。
- ErlyDTL(http://code.google.com/p/erlydtl/):基于著名的 Django Template Language(Python)的 Erlang 移植版。
- sgte(http://code.google.com/p/sgte/):基于 StringTemplate(Java)的 Erlang 移植版。
- Yaws ErlScript(http://yaws.hyber.org/):該模板引擎沒有正式命名,姑且稱之為Yaws ErlScript。類似 PHP,一個正常的 HTML 頁面是一個合法的 Yaws ErlScript 文件。它通過在正常 HTML 中接入特殊標(biāo)簽,然后插 Erlang 腳本代碼實現(xiàn)動態(tài)頁面。
相關(guān)案例查看更多
相關(guān)閱讀
- 云南網(wǎng)站建設(shè)專業(yè)品牌
- 報廢車管理系統(tǒng)
- 云南小程序開發(fā)公司
- 微信分銷系統(tǒng)
- 紅河小程序開發(fā)
- python開發(fā)小程序
- 云南網(wǎng)站建設(shè)公司
- 網(wǎng)站建設(shè)需要多少錢
- 昆明網(wǎng)絡(luò)公司
- 關(guān)鍵詞快速排名
- 百度小程序開發(fā)公司
- 汽車報廢管理
- 昆明網(wǎng)站開發(fā)
- 網(wǎng)絡(luò)公司排名
- 前端
- 汽車報廢軟件
- 軟件定制公司
- 報廢車拆解回收管理系統(tǒng)
- 云南做百度小程序的公司
- 小程序表單
- 云南網(wǎng)站制作
- 云南網(wǎng)站建設(shè)價格
- 云南網(wǎng)站維護(hù)
- 云南科技公司
- uniapp開發(fā)小程序
- 江蘇小程序開發(fā)
- 昆明軟件定制
- 百度推廣
- 人人商城
- 網(wǎng)站開發(fā)哪家好