摘 要: 本文對(duì)Linux下的Web服務(wù)器技術(shù)進(jìn)行了分析,選擇了AppWeb+PHP+Sqlite的組合建立嵌入式Web服務(wù)器作為嵌入式設(shè)備生成動(dòng)態(tài)的管理接口,并討論嵌入式Web服務(wù)器在基于arm-linux平臺(tái)上的移植。
關(guān)鍵詞: ARM-linux AppWeb+PHP+Sqlite Web服務(wù)器
1.引言
用戶需要通過(guò)嵌入式設(shè)備所提供的管理接口才能對(duì)其進(jìn)行配置、管理和監(jiān)控,因此管理接口的易用程度和效率成為衡量設(shè)備質(zhì)量的重要標(biāo)準(zhǔn)之一。在嵌入式設(shè)備中,加入HTTP服務(wù)能將其轉(zhuǎn)化成Web Server,可以向Internet或內(nèi)部網(wǎng)提供基于Web的圖形化管理接口,用戶可以使用瀏覽器作為接口來(lái)訪問(wèn)嵌入式設(shè)備。這樣不僅能夠使設(shè)備的易用性大大提高,而且可以省去專用管理軟件,從而方便地進(jìn)行統(tǒng)一管理。管理接口如果要收集和反饋用戶信息就需要支持?jǐn)?shù)據(jù)庫(kù)。目前,Linux系統(tǒng)廣泛采用Apache+PHP+MySQL的組合來(lái)構(gòu)建Web服務(wù)器,但Apache與MySQL占用的存儲(chǔ)空間與運(yùn)行時(shí)需要的系統(tǒng)資源很高,不適用于嵌入式設(shè)備Web服務(wù)器的構(gòu)建。因此需要選擇對(duì)系統(tǒng)資源要求低且功能相當(dāng)?shù)腁ppweb與Sqlite分別代替Apache與MySQL。
2.Linux下常見(jiàn)的Web服務(wù)器技術(shù)分析
2.1 Linux下常見(jiàn)的HTTP服務(wù)器技術(shù)分析
HTTP服務(wù)器目前常見(jiàn)的有:Thttpd、Apache與AppWeb,優(yōu)缺點(diǎn)分析如下:
Thttpd:是一個(gè)簡(jiǎn)單、小型、可移植、快速的安全http服務(wù)器,還具有其它服務(wù)器目前不具有的十分有用的特點(diǎn)(URL-traffic-based throttling),但它不支持PHP。
Apache:具有安全、高效、可擴(kuò)展及與當(dāng)前http標(biāo)準(zhǔn)保持同步的特點(diǎn),并能在現(xiàn)在常用的操作系統(tǒng)如Unix和Windows上運(yùn)行。但應(yīng)用程序占很大的存儲(chǔ)空間,運(yùn)行時(shí)需要占用很多系統(tǒng)資源,且移植難度很大,不適用于嵌入式設(shè)備。
Appweb:是第一個(gè)嵌入式Web服務(wù)器,它設(shè)計(jì)之初就包含安全的思想,具有十分快速、內(nèi)存使用量小、基于標(biāo)準(zhǔn)的、可移植等特點(diǎn),特別適用于嵌入式設(shè)備,同時(shí)支持PHP。
2.2 Linux下常見(jiàn)的數(shù)據(jù)庫(kù)技術(shù)分析
基于Linux平臺(tái)的數(shù)據(jù)庫(kù)非常多,大型的商用數(shù)據(jù)庫(kù)有Oracle、Sybase、Informix、IBM DB2等,常見(jiàn)的主要有PostgreSQL、MySQL、mSQL、Berkeley DB、SQLite等。
SQLite支持絕大多數(shù)標(biāo)準(zhǔn)的SQL語(yǔ)句,采用單文件存放數(shù)據(jù)庫(kù),速度又比MySQL快上1—2倍,存儲(chǔ)量也不是問(wèn)題,在操作語(yǔ)句上更類(lèi)似關(guān)系型數(shù)據(jù)庫(kù)的使用,其版權(quán)允許無(wú)任何限制的應(yīng)用,包括商業(yè)性的產(chǎn)品。由于具有這些優(yōu)良特性,SQLite已集成至PHP中。
2.3動(dòng)態(tài)網(wǎng)頁(yè)語(yǔ)言技術(shù)分析
ASP全名Active Server Pages,是一個(gè)Web服務(wù)器端的開(kāi)發(fā)環(huán)境,是Microsoft開(kāi)發(fā)的動(dòng)態(tài)網(wǎng)頁(yè)語(yǔ)言,繼承了微軟產(chǎn)品的一貫傳統(tǒng),只能執(zhí)行于微軟的服務(wù)器產(chǎn)品上。
JSP是Sun公司推出的新一代網(wǎng)站開(kāi)發(fā)語(yǔ)言,JSP可以在Serverlet和JavaBean的支持下,完成功能強(qiáng)大的站點(diǎn)程序,但ARM-Linux一般不支持JVM,即不能支持JSP。
PHP是一種跨平臺(tái)的服務(wù)器端的嵌入式腳本語(yǔ)言,能在Windows,Unix,Linux的Web服務(wù)器上正常執(zhí)行。它大量地借用C、Java和Perl語(yǔ)言的語(yǔ)法,并耦合PHP自己的特性,使Web開(kāi)發(fā)者能夠快速地寫(xiě)出動(dòng)態(tài)產(chǎn)生頁(yè)面。它支持目前絕大多數(shù)數(shù)據(jù)庫(kù),包括Sqlite、Oracle、Sybase、Postgres、Mysql,等等。PHP是完全免費(fèi)的,可以獲得源碼。
通過(guò)上述分析,我選擇AppWeb+PHP+Sqlite作為嵌入式Web服務(wù)器。
3.Appweb+PHP+Qlite在ARM-Linux平臺(tái)上的實(shí)現(xiàn)
3.1編譯環(huán)境的設(shè)置
假如交叉編譯工具鏈所在的目錄為/usr/local/armv5b-linux-2.3.3-3.3.2,輸出如下環(huán)境變量:
export PATH=$PATH:/usr/local/armv5b-linux-2.3.3-3.3.2/bin
export CC=″armv5b-linux-gcc″ export AR=″armv5b-linux-ar″
export RANLIB=″armv5b-linux-ranlib″ export STRIP=″armv5b-linux-strip″
export CC_FOR_BUILD=″/usr/bin/gcc″ export LD_FOR_BUILD
=″/usr/bin/ld″
3.2獲得源代碼
Appweb、PHP與Sqlite都可以從網(wǎng)上獲取源代碼。
3.3 Appweb+PHP+Sqlite的編譯
編譯程序時(shí)建立xxx-build及xxx-install目錄(xxx代表應(yīng)該程序,分別為Appweb,PHP與Sqlite),build目錄用于編譯。這樣,編譯過(guò)程生成的文件單獨(dú)保存在此目錄下而不污染源代碼目錄,install目錄用于安裝頭文件、庫(kù)文件,以及執(zhí)行程序等。
3.3.1 Sqlite的編譯
3.3.1.1將Sqlite-2.8.18.tar.gz解壓后將生成Sqlite目錄。
3.3.1.2不同體系結(jié)構(gòu)的Linux,如x86和ARM,會(huì)有些差別,需要對(duì)sqlite/src/sqliteInt.h做一定的修改,以確保btree(B樹(shù))有正確的變量大小,如“ptr”和“char*”。對(duì)于ARM-Linux可以找到如下部分:
# ifndef INTPTR_TYPE
# if SQLITE_PTR_SZ==4
在上面的代碼前加上一句:
# define SQLITE_PTR_SZ 4
這樣后面的“typedef INTPTR_TYPE ptr”就是定義的“int”類(lèi)型,而不是“l(fā)ong”型。
3.3.1.3使用Configure進(jìn)行一些配置。修改Sqlite目錄下的Configure使其不去檢查交叉編譯環(huán)境,注釋掉相應(yīng)代碼行即可。
3.3.1.4修改Makefile文件
將代碼行BCC=armv5b-linux-gcc-g-O2改成BCC=gcc-g-O2。另外,ARM-Linux的交叉編譯工具不提供readline與ncures庫(kù),則繼續(xù)修改Makefile,修改如下兩行:
READLINE_FLAGS=-DHAVE_READLINE=1-I/usr/include/readline→READLINE_FLAGS=LIBREADLINE=-lncurses→LIBREADLINE=
3.3.2 PHP的編譯過(guò)程
3.3.2.1解壓PHP-5.0.4.tar.gz后在當(dāng)前工作目錄下生成PHP-5.0.4目錄。
3.3.2.2修改PHP-5.0.4目錄下的Configure文件使其不去檢查交叉編譯環(huán)境,另外,PHP需要版本不低于2.5.10的Libxml支持,但此版本的Libxml庫(kù)文件的大小為1.2M字節(jié),在嵌入式系統(tǒng)中使用如此大的文件不太合理,而Libexpat的大小只有0.2M字節(jié),因此使用Libexpat代替Libxml進(jìn)行比較簡(jiǎn)單的XML分析,詳見(jiàn)如下的配置內(nèi)容。
3.3.2.3進(jìn)入到PHP-Build目錄,使用Configure進(jìn)行配置,配置的內(nèi)容為:
../PHP-5.0./configure--prefix=../PHP-install--host=armv5b-linux--build=i586-linux
--enable-embed=shared--enable-maintainer-zts--with-sqlite--without-pear
--disable-libxml--disable-dom--disable-simplexml--enable-xml--without-libxml-dir
--with-libexpat-dir=/path/to/expat/install--with-sqlite=/path/to/sqlite/install
3.3.2.4運(yùn)行make生成PHP執(zhí)行程序與LibPHP.so動(dòng)態(tài)加載庫(kù)。并運(yùn)行make install安裝頭文件、庫(kù)文件、執(zhí)行程序,以及man文件到PHP-Install目錄下。
3.3.3 Appweb的編譯
3.3.3.1解壓AppWeb-src-2.0.4-1.tar.gz后在當(dāng)前工作目錄下生成AppWeb-2.0.4目錄。
3.3.3.2進(jìn)入到AppWeb-build目錄,使用Configure進(jìn)行配置,配置的內(nèi)容為
../appWeb-2.0.4/configure--prefix/usr/local/appWeb--sbinDir=/usr/local/appWeb
--type=RELEASE--host=arm-linux--enable-access-log--enable-assert
--enable-config-parse--enable-log--with-PHP5=loadable--with-PHP5-libs=″PHP5 crypt
resolv z″--with-PHP5-dir=/path/to/PHP/install--with-PHP5-flags=″-I$(BLD_TOP)/$(BLD_PHP5_DIR)-I$(BLD_TOP)/$(BLD_PHP5_DIR)/main-I$(BLD_TOP)/$(BLD_PHP5_DIR)/Zend-I$(BLD_TOP)/$(BLD_PHP5_DIR)/TSRM″
3.3.3.3運(yùn)行make生成AppWeb執(zhí)行程序,并運(yùn)行make install安裝執(zhí)行程序及配置的各組件庫(kù),如libauthModule.so等。
4.在ARM-Linux平臺(tái)上運(yùn)行Web服務(wù)器
修改AppWeb文件中ServerRoot與DocumentRoot指令,ServerRoot表示AppWeb各模塊存放目錄(/usr/local/appWeb),DocumentRoot主服務(wù)器文檔存放目錄。將各文檔存放到DocumentRoot指向的目錄。在/etc/rc.d/init.d目錄下建立運(yùn)行服務(wù)器的腳本AppWeb,運(yùn)行service AppWeb start即可。
參考文獻(xiàn):
?。?]魏忠,蔡勇,雷紅衛(wèi).嵌入式開(kāi)發(fā)詳解.北京:電子工業(yè)出版社,2003.
[2]李善平,劉文峰,王煥龍等.Linux與嵌入式系統(tǒng).北京:清華大學(xué)出版社,2003.
?。?]Karim Yaghmour.Building Embedded Linux Systems.O’ReillyPublisher,2003.
?。?]Matthias Kalle Dalheimer.Running Linux(4th Edition).O’ReillyPublisher,2004.
[5]Michael Owens.Embedding an SQL Database with SQLite.Linux Journal,2003,(6).