


使用Kylix3開發Apache DSO
添加時間:2011-3-11
添加:
admin
kylix是linux下非常好的集成開發工具(個人認為是windows程序員轉向Linux最適合的),前一段工作中使用Kylix3進行了Apache動態共享對象(DSO)的開發,在開發工作中遇到了許多的問題,經過摸索一一解決了,有些經驗給大家共享,以免后來者走彎路。
為什么要采用DSO
最重要的原因是效率。Apache是模塊化設計的,所以它可以加載各種各樣的服務器端腳本解釋器來支持動態的網頁。我以前開發的是cgi,但是隨著頁面訪問量的增大,cgi已經不看重負,我需要提高效率。由于原有的代碼量很大,我基礎上不可能重新寫php或者jsp來代替他們,所以我選擇了把最常調用的模塊編譯成動態共享對象(DSO).。
還有一個原因,cgi程序是短連接,不能保存用戶的狀態信息,如果采用常駐內存的DSO,那么這個問題也可以迎刃而解了。
很重要的版本問題
用kylix開發DSO過程中的版本問題是非常重要的。開源的Apache更新的很快,Apache 1.*版本和2.*版本的DSO格式是不一樣的,一定要考慮到。Delphi6/kylix2編譯出來的DSO是對應Apache 1.*版本的。我使用的是kylix3和Apache2.0.43,Borland的官方網站上說kylix3不支持Apache2 的DSO,這讓我郁悶了很長時間。后來知道了Delphi7支持Apache2的消息,而Delphi7的CLX技術是跨平臺的,這讓我找到了解決的辦法。
Delphi7的DSO2工程里要引用HTTPD2、ApacheTwoHTTP和ApacheTwoApp(DSO1對應的是HTTP、ApacheHTTP和ApacheApp),那么我就將Delphi7安裝目錄下源代碼目錄中對應的pas文件拷貝出來,存放到kylix3的源代碼目錄下然后編譯。我查看過源代碼,里面有跨平臺條件編譯的符號,所以這種做法是可行的。
模塊的工作原理
Apache模塊可以在Apache中登記它們提供函數的回叫信號。回叫是一種可以在Apache中登記的函數,Apache可以在請求進程循環中的多個階段調用該函數。回叫通常作為進程的特殊事件處理程序登記。多數Apache為模塊登記回叫函數提供的鏈接都是HTTP請求循環的一部分。Apache當前定義了11種請求循環階段,模塊可以登記回叫函數。它們依次為:讀后請求(Post-Read)、URL翻譯、頭部解析、訪問控制、身份驗證、授權、MIME類型檢查、修正(FixUp)、響應或滿足、日志記錄、清除。
編譯Apache支持DSO
不幸的是,默認的Apache配置是不支持DSO的,所以我們必須修改配置文件然后重新編譯,我是直接通過命令行完成的。這個不難,把得到的httpd*.tar.gz文件解包后,進入該目錄,鍵入如下的命令:
./configure -enable-so
make
make install
在編譯過程中如果出現了問題的話,查看一下出錯的信息,一般都是沒有相應的開發包造成的,把開發包裝上就行了。默認安裝在/user/local/apache2/目錄,如果你要有別的配置要求,鍵入./configure -help自己看看吧。
開發 DSO
有了前面的準備工作,使用Kylix開發DSO就變得非常簡單了,只需要在建立工程的時候選擇生成Apache DSO,和建立CGI沒有什么不同,Kylix把不同的地方透明化了。
在工程文件中還要作如下修改:
默認建立的工程文件(以webSnap工程為例):
Library Project1
Uses
WebBroker,
ApacheApp,
……
{$R *.res}
exports
apache_module name 'Project1_module'
….
….
把Uses中的ApacheApp改為ApacheTwoApp,加入HTTPD2,為什么要這么改不用我解釋了吧^__^。還有一個要修改的地方是HTTPD2.pas文件,找到常量定義的地方,把這個常量MODULE_MAGIC_NUMBER_MAJOR的值改為20020903,這樣Apache2才認這個DSO,切記。
由于DSO是常駐內存的,它不像cgi那樣可以在進程退出時自動釋放所有的資源,所以資源分配和回收的問題尤其重要。在取得數據庫中的數據后一定要記得在適當的析構函數中把數據庫連接關閉,建立某些堆對象使用后一定要釋放內存。當然,不管開發什么樣的程序,這都是一個合格程序員應該做的。
調試DSO有點麻煩,在Borland的官方網站上有介紹,但是我使用我的方法調試,你可以自己決定用什么方法。我先做一個Cgi工程調試,在入口加死循環,然后用kylix自帶的進程捕獲功能捕獲被啟動的cgi,把循環標志位置為假就可以繼續單步執行了。調試完畢確認無誤后建立新的DSO工程,刪除工程原有的單元文件,接著把剛才cgi工程里的所有單元文件加到這個工程里來重新編譯就行了。
部署DSO
當然要修改Apache的配置文件了,做linux下的開發少不了這些操作。
進入apache安裝目錄下的conf目錄,修改httpd.conf文件,加入如下的文字:
LoadModule XXX modules/YYY.so
<Location /ZZZ>
SetHandler YYY-handler
</Location>
啟動Apache后,就可以輸入http://主機名/ZZZ 調用你部署的DSO了。需要注意的問題是,XXX你自己定義的Apache模塊的名稱,在這里你可以寫Project1_module,后面跟的是模塊文件的所在位置,一般都放在modules下,YYY是生成的so文件的名字,在這里應該是Project1.so。如果在啟動或者運行的過程中有一些so文件找不到的話,需要在配置文件里加上SetEnv LD_LIBRARY_PATH so文件所在的路徑。
實例向導
在這里我使用經典的helloWord作為實例,你可以通過這個例子走上Apache DSO開發的漫長道路。現在通過上面的講解,我假設你已經使你的Apache支持DSO了,我們以此為起點一步一步向下走。
1 建立一個websnap工程文件,選擇Apache DSO。命名為helloWorldP.dpr
2 修改源代碼文件
3 修改頁面文件輸出helloWorld。
見下圖所示。如果你要完成其他的功能,和普通的cgi是一樣的。這里只是一個簡單的小例子,并不完成真正的websnap工作。
4 編譯這個工程
kylix的默認設置里會為你生成的DSO文件加上lib前綴,所以你可以看到在你保存工程文件的地方新生成了一個文件libhelloWordP.so,這就是生成的DSO文件。把這個文件拷貝到Apache安裝目錄的modules子目錄下。
5 改寫Apache配置文件
進入apache安裝目錄下的conf目錄,修改httpd.conf文件,加入如下的文字:
LoadModule helloWorld_module modules/helloWorldP.so
<Location /hello>
SetHandler helloWorldP-handler
</Location>
6 興奮的時刻到了
我說的可不夸張,當我經歷了種種出錯提示之后就是這種感覺。現在重啟Apache,在瀏覽器中敲入http://你的服務器名/hello ,hello就是你在配置文件中包含在Location定位符后面的文字,不能與已經存在的其他cgi等定位重名(我曾深受其害)。如果沒有問題的話,你會看到下面的東西:
就是這些了,這僅僅是個開始,接著開始你的工作吧,你會發現linux下的開發也是很有意思的。需要注意的是,在linux下大小寫是敏感的,千萬不要把windows下的壞習慣來過來,那樣你會白白耽誤很多時間。
關鍵字:Kylix3 開發 Apache DSO
為什么要采用DSO
最重要的原因是效率。Apache是模塊化設計的,所以它可以加載各種各樣的服務器端腳本解釋器來支持動態的網頁。我以前開發的是cgi,但是隨著頁面訪問量的增大,cgi已經不看重負,我需要提高效率。由于原有的代碼量很大,我基礎上不可能重新寫php或者jsp來代替他們,所以我選擇了把最常調用的模塊編譯成動態共享對象(DSO).。
還有一個原因,cgi程序是短連接,不能保存用戶的狀態信息,如果采用常駐內存的DSO,那么這個問題也可以迎刃而解了。
很重要的版本問題
用kylix開發DSO過程中的版本問題是非常重要的。開源的Apache更新的很快,Apache 1.*版本和2.*版本的DSO格式是不一樣的,一定要考慮到。Delphi6/kylix2編譯出來的DSO是對應Apache 1.*版本的。我使用的是kylix3和Apache2.0.43,Borland的官方網站上說kylix3不支持Apache2 的DSO,這讓我郁悶了很長時間。后來知道了Delphi7支持Apache2的消息,而Delphi7的CLX技術是跨平臺的,這讓我找到了解決的辦法。
Delphi7的DSO2工程里要引用HTTPD2、ApacheTwoHTTP和ApacheTwoApp(DSO1對應的是HTTP、ApacheHTTP和ApacheApp),那么我就將Delphi7安裝目錄下源代碼目錄中對應的pas文件拷貝出來,存放到kylix3的源代碼目錄下然后編譯。我查看過源代碼,里面有跨平臺條件編譯的符號,所以這種做法是可行的。
模塊的工作原理
Apache模塊可以在Apache中登記它們提供函數的回叫信號。回叫是一種可以在Apache中登記的函數,Apache可以在請求進程循環中的多個階段調用該函數。回叫通常作為進程的特殊事件處理程序登記。多數Apache為模塊登記回叫函數提供的鏈接都是HTTP請求循環的一部分。Apache當前定義了11種請求循環階段,模塊可以登記回叫函數。它們依次為:讀后請求(Post-Read)、URL翻譯、頭部解析、訪問控制、身份驗證、授權、MIME類型檢查、修正(FixUp)、響應或滿足、日志記錄、清除。
編譯Apache支持DSO
不幸的是,默認的Apache配置是不支持DSO的,所以我們必須修改配置文件然后重新編譯,我是直接通過命令行完成的。這個不難,把得到的httpd*.tar.gz文件解包后,進入該目錄,鍵入如下的命令:
./configure -enable-so
make
make install
在編譯過程中如果出現了問題的話,查看一下出錯的信息,一般都是沒有相應的開發包造成的,把開發包裝上就行了。默認安裝在/user/local/apache2/目錄,如果你要有別的配置要求,鍵入./configure -help自己看看吧。
開發 DSO
有了前面的準備工作,使用Kylix開發DSO就變得非常簡單了,只需要在建立工程的時候選擇生成Apache DSO,和建立CGI沒有什么不同,Kylix把不同的地方透明化了。
在工程文件中還要作如下修改:
默認建立的工程文件(以webSnap工程為例):
Library Project1
Uses
WebBroker,
ApacheApp,
……
{$R *.res}
exports
apache_module name 'Project1_module'
….
….
把Uses中的ApacheApp改為ApacheTwoApp,加入HTTPD2,為什么要這么改不用我解釋了吧^__^。還有一個要修改的地方是HTTPD2.pas文件,找到常量定義的地方,把這個常量MODULE_MAGIC_NUMBER_MAJOR的值改為20020903,這樣Apache2才認這個DSO,切記。
由于DSO是常駐內存的,它不像cgi那樣可以在進程退出時自動釋放所有的資源,所以資源分配和回收的問題尤其重要。在取得數據庫中的數據后一定要記得在適當的析構函數中把數據庫連接關閉,建立某些堆對象使用后一定要釋放內存。當然,不管開發什么樣的程序,這都是一個合格程序員應該做的。
調試DSO有點麻煩,在Borland的官方網站上有介紹,但是我使用我的方法調試,你可以自己決定用什么方法。我先做一個Cgi工程調試,在入口加死循環,然后用kylix自帶的進程捕獲功能捕獲被啟動的cgi,把循環標志位置為假就可以繼續單步執行了。調試完畢確認無誤后建立新的DSO工程,刪除工程原有的單元文件,接著把剛才cgi工程里的所有單元文件加到這個工程里來重新編譯就行了。
部署DSO
當然要修改Apache的配置文件了,做linux下的開發少不了這些操作。
進入apache安裝目錄下的conf目錄,修改httpd.conf文件,加入如下的文字:
LoadModule XXX modules/YYY.so
<Location /ZZZ>
SetHandler YYY-handler
</Location>
啟動Apache后,就可以輸入http://主機名/ZZZ 調用你部署的DSO了。需要注意的問題是,XXX你自己定義的Apache模塊的名稱,在這里你可以寫Project1_module,后面跟的是模塊文件的所在位置,一般都放在modules下,YYY是生成的so文件的名字,在這里應該是Project1.so。如果在啟動或者運行的過程中有一些so文件找不到的話,需要在配置文件里加上SetEnv LD_LIBRARY_PATH so文件所在的路徑。
實例向導
在這里我使用經典的helloWord作為實例,你可以通過這個例子走上Apache DSO開發的漫長道路。現在通過上面的講解,我假設你已經使你的Apache支持DSO了,我們以此為起點一步一步向下走。
1 建立一個websnap工程文件,選擇Apache DSO。命名為helloWorldP.dpr
2 修改源代碼文件
3 修改頁面文件輸出helloWorld。
見下圖所示。如果你要完成其他的功能,和普通的cgi是一樣的。這里只是一個簡單的小例子,并不完成真正的websnap工作。
4 編譯這個工程
kylix的默認設置里會為你生成的DSO文件加上lib前綴,所以你可以看到在你保存工程文件的地方新生成了一個文件libhelloWordP.so,這就是生成的DSO文件。把這個文件拷貝到Apache安裝目錄的modules子目錄下。
5 改寫Apache配置文件
進入apache安裝目錄下的conf目錄,修改httpd.conf文件,加入如下的文字:
LoadModule helloWorld_module modules/helloWorldP.so
<Location /hello>
SetHandler helloWorldP-handler
</Location>
6 興奮的時刻到了
我說的可不夸張,當我經歷了種種出錯提示之后就是這種感覺。現在重啟Apache,在瀏覽器中敲入http://你的服務器名/hello ,hello就是你在配置文件中包含在Location定位符后面的文字,不能與已經存在的其他cgi等定位重名(我曾深受其害)。如果沒有問題的話,你會看到下面的東西:
就是這些了,這僅僅是個開始,接著開始你的工作吧,你會發現linux下的開發也是很有意思的。需要注意的是,在linux下大小寫是敏感的,千萬不要把windows下的壞習慣來過來,那樣你會白白耽誤很多時間。
關鍵字:Kylix3 開發 Apache DSO
新文章:
- CentOS7下圖形配置網絡的方法
- CentOS 7如何添加刪除用戶
- 如何解決centos7雙系統后丟失windows啟動項
- CentOS單網卡如何批量添加不同IP段
- CentOS下iconv命令的介紹
- Centos7 SSH密鑰登陸及密碼密鑰雙重驗證詳解
- CentOS 7.1添加刪除用戶的方法
- CentOS查找/掃描局域網打印機IP講解
- CentOS7使用hostapd實現無AP模式的詳解
- su命令不能切換root的解決方法
- 解決VMware下CentOS7網絡重啟出錯
- 解決Centos7雙系統后丟失windows啟動項
- CentOS下如何避免文件覆蓋
- CentOS7和CentOS6系統有什么不同呢
- Centos 6.6默認iptable規則詳解