kylix是linux下非常好的集成開發(fā)工具(個人認為是windows程序員轉(zhuǎn)向Linux最適合的),前一段工作中使用Kylix3進行了Apache動態(tài)共享對象(DSO)的開發(fā),在開發(fā)工作中遇到了許多的問題,經(jīng)過摸索一一解決了,有些經(jīng)驗給大家共享,以免后來者走彎路。
為什么要采用DSO
最重要的原因是效率。Apache是模塊化設(shè)計的,所以它可以加載各種各樣的服務(wù)器端腳本解釋器來支持動態(tài)的網(wǎng)頁。我以前開發(fā)的是cgi,但是隨著頁面訪問量的增大,cgi已經(jīng)不看重負,我需要提高效率。由于原有的代碼量很大,我基本上不可能重新寫php或者jsp來代替他們,所以我選擇了把最常調(diào)用的模塊編譯成動態(tài)共享對象(DSO).。
還有一個原因,cgi程序是短連接,不能保存用戶的狀態(tài)信息,如果采用常駐內(nèi)存的DSO,那么這個問題也可以迎刃而解了。
很重要的版本問題
用kylix開發(fā)DSO過程中的版本問題是非常重要的。開源的Apache更新的很快,Apache 1.*版本和2.*版本的DSO格式是不一樣的,一定要考慮到。Delphi6/kylix2編譯出來的DSO是對應(yīng)Apache 1.*版本的。我使用的是kylix3和Apache2.0.43,Borland的官方網(wǎng)站上說kylix3不支持Apache2 的DSO,這讓我郁悶了很長時間。后來知道了Delphi7支持Apache2的消息,而Delphi7的CLX技術(shù)是跨平臺的,這讓我找到了解決的辦法。
Delphi7的DSO2工程里要引用HTTPD2、ApacheTwoHTTP和ApacheTwoApp(DSO1對應(yīng)的是HTTP、ApacheHTTP和ApacheApp),那么我就將Delphi7安裝目錄下源代碼目錄中對應(yīng)的pas文件拷貝出來,存放到kylix3的源代碼目錄下然后編譯。我查看過源代碼,里面有跨平臺條件編譯的符號,所以這種做法是可行的。
模塊的工作原理
Apache模塊可以在Apache中登記它們提供函數(shù)的回叫信號?;亟惺且环N可以在Apache中登記的函數(shù),Apache可以在請求進程循環(huán)中的多個階段調(diào)用該函數(shù)?;亟型ǔW鳛檫M程的特殊事件處理程序登記。多數(shù)Apache為模塊登記回叫函數(shù)提供的鏈接都是HTTP請求循環(huán)的一部分。Apache當(dāng)前定義了11種請求循環(huán)階段,模塊可以登記回叫函數(shù)。它們依次為:讀后請求(Post-Read)、URL翻譯、頭部解析、訪問控制、身份驗證、授權(quán)、MIME類型檢查、修正(FixUp)、響應(yīng)或滿足、日志記錄、清除。
編譯Apache支持DSO
不幸的是,默認的Apache配置是不支持DSO的,所以我們必須修改配置文件然后重新編譯,我是直接通過命令行完成的。這個不難,把得到的httpd*.tar.gz文件解包后,進入該目錄,鍵入如下的命令:
./configure -enable-so
make
make install
在編譯過程中如果出現(xiàn)了問題的話,查看一下出錯的信息,一般都是沒有相應(yīng)的開發(fā)包造成的,把開發(fā)包裝上就行了。默認安裝在/user/local/apache2/目錄,如果你要有別的配置要求,鍵入./configure -help自己看看吧。
開發(fā) DSO
有了前面的準備工作,使用Kylix開發(fā)DSO就變得非常簡單了,只需要在建立工程的時候選擇生成Apache DSO,和建立CGI沒有什么不同,Kylix把不同的地方透明化了。
在工程文件中還要作如下修改:
默認建立的工程文件(以webSnap工程為例):
Library Project1
Uses
WebBroker,
ApacheApp,
……
{$R *.res}
exports
apache_module name 'Project1_module'
….
….
為什么要采用DSO
最重要的原因是效率。Apache是模塊化設(shè)計的,所以它可以加載各種各樣的服務(wù)器端腳本解釋器來支持動態(tài)的網(wǎng)頁。我以前開發(fā)的是cgi,但是隨著頁面訪問量的增大,cgi已經(jīng)不看重負,我需要提高效率。由于原有的代碼量很大,我基本上不可能重新寫php或者jsp來代替他們,所以我選擇了把最常調(diào)用的模塊編譯成動態(tài)共享對象(DSO).。
還有一個原因,cgi程序是短連接,不能保存用戶的狀態(tài)信息,如果采用常駐內(nèi)存的DSO,那么這個問題也可以迎刃而解了。
很重要的版本問題
用kylix開發(fā)DSO過程中的版本問題是非常重要的。開源的Apache更新的很快,Apache 1.*版本和2.*版本的DSO格式是不一樣的,一定要考慮到。Delphi6/kylix2編譯出來的DSO是對應(yīng)Apache 1.*版本的。我使用的是kylix3和Apache2.0.43,Borland的官方網(wǎng)站上說kylix3不支持Apache2 的DSO,這讓我郁悶了很長時間。后來知道了Delphi7支持Apache2的消息,而Delphi7的CLX技術(shù)是跨平臺的,這讓我找到了解決的辦法。
Delphi7的DSO2工程里要引用HTTPD2、ApacheTwoHTTP和ApacheTwoApp(DSO1對應(yīng)的是HTTP、ApacheHTTP和ApacheApp),那么我就將Delphi7安裝目錄下源代碼目錄中對應(yīng)的pas文件拷貝出來,存放到kylix3的源代碼目錄下然后編譯。我查看過源代碼,里面有跨平臺條件編譯的符號,所以這種做法是可行的。
模塊的工作原理
Apache模塊可以在Apache中登記它們提供函數(shù)的回叫信號?;亟惺且环N可以在Apache中登記的函數(shù),Apache可以在請求進程循環(huán)中的多個階段調(diào)用該函數(shù)?;亟型ǔW鳛檫M程的特殊事件處理程序登記。多數(shù)Apache為模塊登記回叫函數(shù)提供的鏈接都是HTTP請求循環(huán)的一部分。Apache當(dāng)前定義了11種請求循環(huán)階段,模塊可以登記回叫函數(shù)。它們依次為:讀后請求(Post-Read)、URL翻譯、頭部解析、訪問控制、身份驗證、授權(quán)、MIME類型檢查、修正(FixUp)、響應(yīng)或滿足、日志記錄、清除。
編譯Apache支持DSO
不幸的是,默認的Apache配置是不支持DSO的,所以我們必須修改配置文件然后重新編譯,我是直接通過命令行完成的。這個不難,把得到的httpd*.tar.gz文件解包后,進入該目錄,鍵入如下的命令:
./configure -enable-so
make
make install
在編譯過程中如果出現(xiàn)了問題的話,查看一下出錯的信息,一般都是沒有相應(yīng)的開發(fā)包造成的,把開發(fā)包裝上就行了。默認安裝在/user/local/apache2/目錄,如果你要有別的配置要求,鍵入./configure -help自己看看吧。
開發(fā) DSO
有了前面的準備工作,使用Kylix開發(fā)DSO就變得非常簡單了,只需要在建立工程的時候選擇生成Apache DSO,和建立CGI沒有什么不同,Kylix把不同的地方透明化了。
在工程文件中還要作如下修改:
默認建立的工程文件(以webSnap工程為例):
Library Project1
Uses
WebBroker,
ApacheApp,
……
{$R *.res}
exports
apache_module name 'Project1_module'
….
….