国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

使用Kylix3開發(fā)Apache DSO

2019-11-17 05:14:46
字體:
供稿:網(wǎng)友

  2003 年 1 月
kylix是linux下非常好的集成開發(fā)工具(個(gè)人認(rèn)為是windows程序員轉(zhuǎn)向Linux最適合的),前一段工作中使用Kylix3進(jìn)行了Apache動(dòng)態(tài)共享對(duì)象(DSO)的開發(fā),在開發(fā)工作中碰到了許多的問題,經(jīng)過摸索一一解決了,有些經(jīng)驗(yàn)給大家共享,以免后來者走彎路。

為什么要采用DSO
最重要的原因是效率。Apache是模塊化設(shè)計(jì)的,所以它可以加載各種各樣的服務(wù)器端腳本解釋器來支持動(dòng)態(tài)的網(wǎng)頁。我以前開發(fā)的是cgi,但是隨著頁面訪問量的增大,cgi已經(jīng)不看重負(fù),我需要提高效率。由于原有的代碼量很大,我基本上不可能重新寫php或者jsp來代替他們,所以我選擇了把最常調(diào)用的模塊編譯成動(dòng)態(tài)共享對(duì)象(DSO).。

還有一個(gè)原因,cgi程序是短連接,不能保存用戶的狀態(tài)信息,假如采用常駐內(nèi)存的DSO,那么這個(gè)問題也可以迎刃而解了。

很重要的版本問題
用kylix開發(fā)DSO過程中的版本問題是非常重要的。開源的Apache更新的很快,Apache 1.*版本和2.*版本的DSO格式是不一樣的,一定要考慮到。Delphi6/kylix2編譯出來的DSO是對(duì)應(yīng)Apache 1.*版本的。我使用的是kylix3和Apache2.0.43,Borland的官方網(wǎng)站上說kylix3不支持Apache2 的DSO,這讓我郁悶了很長時(shí)間。后來知道了Delphi7支持Apache2的消息,而Delphi7的CLX技術(shù)是跨平臺(tái)的,這讓我找到了解決的辦法。

Delphi7的DSO2工程里要引用HTTPD2、ApacheTwoHTTP和ApacheTwoApp(DSO1對(duì)應(yīng)的是HTTP、ApacheHTTP和ApacheApp),那么我就將Delphi7安裝目錄下源代碼目錄中對(duì)應(yīng)的pas文件拷貝出來,存放到kylix3的源代碼目錄下然后編譯。我查看過源代碼,里面有跨平臺(tái)條件編譯的符號(hào),所以這種做法是可行的。

模塊的工作原理
Apache模塊可以在Apache中登記它們提供函數(shù)的回叫信號(hào)。回叫是一種可以在Apache中登記的函數(shù),Apache可以在請(qǐng)求進(jìn)程循環(huán)中的多個(gè)階段調(diào)用該函數(shù)。回叫通常作為進(jìn)程的非凡事件處理程序登記。多數(shù)Apache為模塊登記回叫函數(shù)提供的鏈接都是HTTP請(qǐng)求循環(huán)的一部分。Apache當(dāng)前定義了11種請(qǐng)求循環(huán)階段,模塊可以登記回叫函數(shù)。它們依次為:讀后請(qǐng)求(Post-Read)、URL翻譯、頭部解析、訪問控制、身份驗(yàn)證、授權(quán)、MIME類型檢查、修正(FixUp)、響應(yīng)或滿足、日志記錄、清除。

編譯Apache支持DSO
不幸的是,默認(rèn)的Apache配置是不支持DSO的,所以我們必須修改配置文件然后重新編譯,我是直接通過命令行完成的。這個(gè)不難,把得到的httpd*.tar.gz文件解包后,進(jìn)入該目錄,鍵入如下的命令:

./configure -enable-so
make
make install


在編譯過程中假如出現(xiàn)了問題的話,查看一下出錯(cuò)的信息,一般都是沒有相應(yīng)的開發(fā)包造成的,把開發(fā)包裝上就行了。默認(rèn)安裝在/user/local/apache2/目錄,假如你要有別的配置要求,鍵入./configure -help自己看看吧。

開發(fā) DSO
有了前面的預(yù)備工作,使用Kylix開發(fā)DSO就變得非常簡(jiǎn)單了,只需要在建立工程的時(shí)候選擇生成Apache DSO,和建立CGI沒有什么不同,Kylix把不同的地方透明化了。

在工程文件中還要作如下修改:

默認(rèn)建立的工程文件(以webSnap工程為例):

Library PRoject1
Uses
WebBroker,
ApacheApp,
……
{$R *.res}
eXPorts
apache_module name 'Project1_module'
….
….


把Uses中的ApacheApp改為ApacheTwoApp,加入HTTPD2,為什么要這么改不用我解釋了吧^__^。還有一個(gè)要修改的地方是HTTPD2.pas文件,找到常量定義的地方,把這個(gè)常量MODULE_MAGIC_NUMBER_MAJOR的值改為20020903,這樣Apache2才認(rèn)這個(gè)DSO,切記。

由于DSO是常駐內(nèi)存的,它不像cgi那樣可以在進(jìn)程退出時(shí)自動(dòng)釋放所有的資源,所以資源分配和回收的問題尤其重要。在取得數(shù)據(jù)庫中的數(shù)據(jù)后一定要記得在適當(dāng)?shù)奈鰳?gòu)函數(shù)中把數(shù)據(jù)庫連接關(guān)閉,建立某些堆對(duì)象使用后一定要釋放內(nèi)存。當(dāng)然,不管開發(fā)什么樣的程序,這都是一個(gè)合格程序員應(yīng)該做的。

調(diào)試DSO有點(diǎn)麻煩,在Borland的官方網(wǎng)站上有介紹,但是我使用我的方法調(diào)試,你可以自己決定用什么方法。我先做一個(gè)Cgi工程調(diào)試,在入口加死循環(huán),然后用kylix自帶的進(jìn)程捕捉功能捕捉被啟動(dòng)的cgi,把循環(huán)標(biāo)志位置為假就可以繼續(xù)單步執(zhí)行了。調(diào)試完畢確認(rèn)無誤后建立新的DSO工程,刪除工程原有的單元文件,接著把剛才cgi工程里的所有單元文件加到這個(gè)工程里來重新編譯就行了。


部署DSO
當(dāng)然要修改Apache的配置文件了,做linux下的開發(fā)少不了這些操作。

進(jìn)入apache安裝目錄下的conf目錄,修改httpd.conf文件,加入如下的文字:

LoadModule XXX modules/YYY.so
<Location /ZZZ>
SetHandler YYY-handler
</Location>


啟動(dòng)Apache后,就可以輸入http://主機(jī)名/ZZZ 調(diào)用你部署的DSO了。需要注重的問題是,XXX你自己定義的Apache模塊的名稱,在這里你可以寫Project1_module,后面跟的是模塊文件的所在位置,一般都放在modules下,YYY是生成的so文件的名字,在這里應(yīng)該是Project1.so。假如在啟動(dòng)或者運(yùn)行的過程中有一些so文件找不到的話,需要在配置文件里加上SetEnv LD_LIBRARY_PATH so文件所在的路徑。

實(shí)例向?qū)?br />在這里我使用經(jīng)典的helloWord作為實(shí)例,你可以通過這個(gè)例子走上Apache DSO開發(fā)的漫長道路。現(xiàn)在通過上面的講解,我假設(shè)你已經(jīng)使你的Apache支持DSO了,我們以此為起點(diǎn)一步一步向下走。

1 建立一個(gè)websnap工程文件,選擇Apache DSO。命名為helloWorldP.dpr


2 修改源代碼文件

3 修改頁面文件輸出helloWorld。

見下圖所示。假如你要完成其他的功能,和普通的cgi是一樣的。這里只是一個(gè)簡(jiǎn)單的小例子,并不完成真正的websnap工作。

4 編譯這個(gè)工程

kylix的默認(rèn)設(shè)置里會(huì)為你生成的DSO文件加上lib前綴,所以你可以看到在你保存工程文件的地方新生成了一個(gè)文件libhelloWordP.so,這就是生成的DSO文件。把這個(gè)文件拷貝到Apache安裝目錄的modules子目錄下。

5 改寫Apache配置文件

進(jìn)入apache安裝目錄下的conf目錄,修改httpd.conf文件,加入如下的文字:

LoadModule helloWorld_module modules/helloWorldP.so
<Location /hello>
SetHandler helloWorldP-handler
</Location>


6 興奮的時(shí)刻到了
我說的可不夸張,當(dāng)我經(jīng)歷了種種出錯(cuò)提示之后就是這種感覺。現(xiàn)在重啟Apache,在
瀏覽器中敲入http://你的服務(wù)器名/hello ,hello就是你在配置文件中包含在Location定
位符后面的文字,不能與已經(jīng)存在的其他cgi等定位重名(我曾深受其害)。 假如沒有問
題的話,你會(huì)看到下面的東西:
就是這些了,這僅僅是個(gè)開始,接著開始你的工作吧, 你會(huì)發(fā)現(xiàn)linux下的開發(fā)也是
很有意思的。需要注重的是,在linux下大小寫是敏感的,千萬不要把windows下的壞習(xí)慣
來過來,那樣你會(huì)白白耽誤很多時(shí)間。

參考資料:

* 《linux Apache Web Server治理指南》
* 你可以在這里找到更多的開發(fā)參考:http://www.thedelphimagazine.com/
* 關(guān)于linux下的開發(fā),在IBM DeveloperWorks有很多的中文參考。

關(guān)于作者:
侯光敏,對(duì)未知事務(wù)布滿好奇的程序員,飄在北京。 目前使用Kylix做linux下的Web
開發(fā),也使用java進(jìn)行開發(fā)工作。我的電子郵件 wearebug@etang.com, 不要發(fā)廣告和垃
圾郵件,求求你了。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 吴江市| 凤庆县| 合水县| 钟祥市| 德化县| 永康市| 黄浦区| 隆林| 安阳市| 利津县| 阿坝县| 玛纳斯县| 巴东县| 竹溪县| 咸宁市| 贵定县| 牙克石市| 东宁县| 蒙山县| 顺昌县| 陈巴尔虎旗| 双流县| 武穴市| 宜兰县| 德化县| 黎平县| 江都市| 鹿邑县| 四川省| 绿春县| 米脂县| 晋宁县| 五原县| 织金县| 日土县| 东至县| 新疆| 上犹县| 马边| 马边| 库车县|