使用Kylix3开发Apache DSO | ![]() | ![]() | ||
![]() | ||||
![]() |
![]() |
侯光敏 (wearebug@etang.com) kylix是Linux下非常好的集成开发工具(个人认为是windows程序员转向Linux最适合的),前一段工作中使用Kylix3进行了Apache动态共享对象(DSO)的开发,在开发工作中遇到了许多的问题,经过摸索一一解决了,有些经验给大家共享,以免后来者走弯路。 为什么要采用DSO 还有一个原因,cgi程序是短连接,不能保存用户的状态信息,如果采用常驻内存的DSO,那么这个问题也可以迎刃而解了。 很重要的版本问题 Delphi7的DSO2工程里要引用HTTPD2、ApacheTwoHTTP和ApacheTwoApp(DSO1对应的是HTTP、ApacheHTTP和ApacheApp),那么我就将Delphi7安装目录下源代码目录中对应的pas文件拷贝出来,存放到kylix3的源代码目录下然后编译。我查看过源代码,里面有跨平台条件编译的符号,所以这种做法是可行的。 模块的工作原理 编译Apache支持DSO
在编译过程中如果出现了问题的话,查看一下出错的信息,一般都是没有相应的开发包造成的,把开发包装上就行了。默认安装在/user/local/apache2/目录,如果你要有别的配置要求,键入./configure -help自己看看吧。 开发 DSO 在工程文件中还要作如下修改: 默认建立的工程文件(以webSnap工程为例):
把Uses中的ApacheApp改为ApacheTwoApp,加入HTTPD2,为什么要这么改不用我解释了吧^__^。还有一个要修改的地方是HTTPD2.pas文件,找到常量定义的地方,把这个常量MODULE_MAGIC_NUMBER_MAJOR的值改为20020903,这样Apache2才认这个DSO,切记。 由于DSO是常驻内存的,它不像cgi那样可以在进程退出时自动释放所有的资源,所以资源分配和回收的问题尤其重要。在取得数据库中的数据后一定要记得在适当的析构函数中把数据库连接关闭,建立某些堆对象使用后一定要释放内存。当然,不管开发什么样的程序,这都是一个合格程序员应该做的。 调试DSO有点麻烦,在Borland的官方网站上有介绍,但是我使用我的方法调试,你可以自己决定用什么方法。我先做一个Cgi工程调试,在入口加死循环,然后用kylix自带的进程捕获功能捕获被启动的cgi,把循环标志位置为假就可以继续单步执行了。调试完毕确认无误后建立新的DSO工程,删除工程原有的单元文件,接着把刚才cgi工程里的所有单元文件加到这个工程里来重新编译就行了。 部署DSO 进入apache安装目录下的conf目录,修改httpd.conf文件,加入如下的文字:
启动Apache后,就可以输入http://主机名/ZZZ 调用你部署的DSO了。需要注意的问题是,XXX你自己定义的Apache模块的名称,在这里你可以写Project1_module,后面跟的是模块文件的所在位置,一般都放在modules下,YYY是生成的so文件的名字,在这里应该是Project1.so。如果在启动或者运行的过程中有一些so文件找不到的话,需要在配置文件里加上SetEnv LD_LIBRARY_PATH so文件所在的路径。 实例向导 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文件,加入如下的文字:
6 兴奋的时刻到了 我说的可不夸张,当我经历了种种出错提示之后就是这种感觉。现在重启Apache,在浏览器中敲入http://你的服务器名/hello ,hello就是你在配置文件中包含在Location定位符后面的文字,不能与已经存在的其他cgi等定位重名(我曾深受其害)。如果没有问题的话,你会看到下面的东西: ![]() 就是这些了,这仅仅是个开始,接着开始你的工作吧,你会发现Linux下的开发也是很有意思的。需要注意的是,在linux下大小写是敏感的,千万不要把windows下的坏习惯来过来,那样你会白白耽误很多时间。
|