在前几天的一篇文章中,我已经很详细的说明了如何为使用delphi编译linux程序来搭建编程环境,那今天我们就开始进行一个简单的实战吧。今天会使用到一个第三方的控件,TMS Sparkle,这个是一个第三方收费的控件TMSBIZ里的一个组件。

       1、首先我们应该在Linux里面安装Apache,如果没有安装,我们直接在linux下输入这个安装命令就可以了。

sudo apt-get install apache2

       安装完成后,我们在浏览器里输入linux的IP地址,比如我的是192.168.1.240,那我输入http://192.168.1.240回车后, 如果出现Apache的默认页面就表示安装成功了。如下图:

       image.png

       2、然后将PAServer打开并运行(这个可以详见上次的文章),然后在Delphi里新建一个Web Server Application工程,在弹出的窗体里我们现在Linux选项然后点下一步,接着我们再选"Apache Dynamic Link Module"继续下一步,这时候我们可以命名ApacheModule的名称,因为我这个是实际使用的名字,所以我键入了"sparkleserver_module"后就点完成按钮就OK了。在新建的项目的Target Platforms我们可以发现已经有了一个Linux64的目标平台,后面就是前面文章中我们设置的Linux SDK,并切换成默认。

       image.png

       这就是我们生成新项目并将Linux切换成默认后的项目的样式。

       image.png

      3、现在我们可以尝试编译下我们的程序,然后到linux用户根目录下的PAServer/Scratch-dir/一级一级目录进去,就可以发现你的.so程序已经安装的躺在里面了, 表示现在你的所有操作都是没有问题的。程序的功能我们过会儿在完成,现在我们先给我们的新的module程序在Apache下做个设置,以便后面我们可以随时调试程序使用。首先我们进入Apache的设置目录,然后新建两个配置文件,命令如下:

cd /etc/apache2/mods-available
sudo touch sparkleserver.conf
sudo touch sparkleserver.load

       我们首先编辑我们的.load配置文件,一般我们都是使用vim,或者你也可以使用nano根据自己的喜好,就像我们在windows下你可以使用word也可以使用wps一样。

sudo vi sparkleserver.load

       在.load配置文件里我们输入下面的内容,注意,第一,moudle名使用我们在第2步输入的那个module名,不能有错误;第二,我们这里的目录必须使用前面我们看到的.so文件的目录,不能有错,这里我这里根据我的环境大概写个示例,没有用真实的路径。第三,Linux下注意大小写一致。

LoadModule sparkleserver_module /home/henryxu/PAServer/scratch-dir/HenryXu/mod_SparkleServer/libmod_SparkleServer.so

       保存退出后,我们再编辑我们的.conf配置文件,命令类似同上,在里面的输入如下的内容:

<Location /sparkle>
    SetHandler libmod_SparkleServer-handler
</Location>

      上面的内容第一行的sparkle就是一会儿在网址上输入的路径,第二个也就是你的生成的文件名再加"-handler",你可以参考你在delphi下的项目文件里的一段注释说明。

      都完成后,我们就可以将我们建立的module生效并重新启动Apache服务,如果有错误,命令行中会有提示,你再一步一步的查看是哪一步出现了错误。

sudo a2enmod sparkleserver
sudo apache2ctl stop
sudo apache2ctl start

下面两个命令也可以使用

service apache2 restartser

      4、最后,我们里浏览器里输入http://192.168.1.240/sparkle后,我们可以发现,现在已经出现了最最简单的文字了,这个文字就是我们Delphi程序中WebModule单元里的文字。

      image.png

      5、现在我们可以使用我们的Sparkle做服务程序了。我们在delphi程序中的新建项目里的webmodule文件的user块里加入sparkle的单元文件Sparkle.WebBroker.Server、Sparkle.WebBroker.Adapter、 Sparkle.HttpServer.Module和 Sparkle.HttpServer.Context,  然后加入一个全局变量:

var
  oSparkleServer: TWebBrokerServer;

       接着在unit的最后加入初始化代码:

initialization
   oSparkleServer := TWebBrokerServer.Create;
finalization
   oSparkleServer.Free;
end.

      然后再原有默认的WebModule1DefaultHandlerAction事件里修改如下的代码用来派发请求:

procedure TWebModule1.WebModule1DefaultHandlerAction(Sender: TObject; Request: TWebRequest; Response: TWebResponse;
  var Handled: Boolean);
var
  Adapter: IWebBrokerAdapter;
begin
  Adapter := TWebBrokerAdapter.Create(Request, Response);
  oSparkleServer.DispatchRequest(Adapter);
end;

      最后我们在上一步的initialization初始化代码那里将Sparkle插入到ApacheModule里,现在你可以添加自己的代码,也可以添加Sparkle的web处理模块并将它们加u人到Dispatcher里面去。下面我做个简单的例子。

initialization  
  oSparkleServer := TWebBrokerServer.Create;
  // add modules you want to use. This example assumes a simple Sparkle module,  
  // but you can add your XData, RemoteDB or any other Sparkle module  
  Server.Dispatcher.AddModule(TAnonymousServerModule.Create(  
    'http://localhost/tms/hello',  
    procedure(const C: THttpServerContext)  
    begin  
      C.Response.StatusCode := 200;  
      C.Response.ContentType := 'text/plain'';  
      C.Response.Close(TEncoding.UTF8.GetBytes('Hello from Sparkle!'));  
    end  
  ));  
finalization  
  oSparkleServer.Free;
end.

      现在我们重新编译新的代码并且发布到linux里面去,然后重新启动Apache2后,可以刷新原来的浏览器页面,可以发现上面的"Hello from Sparkle"已经出现了。于是你可以尽情的修改sparklewebmodule的内容了。。