2010-04-15 63 views
0

我有一个用Delphi 2007创建的“ActiveX库”项目。库接口根据输入值返回XML数据。然后,这由一个在网页上显示数据的PHP脚本使用。这很好用!在delphi中启动一个dll的多个进程

问题是我只能在服务器上运行dll进程的一个实例。但是,出于安全原因,我的每个客户都应该能够访问他们自己的dll进程(因为dll始终只连接到一个数据库)。

此外,由于delphi代码的构建方式,它不支持多个线程。 (这是一个使用大量单例类的100000多行项目)

是否有一种方法可以启动同一个dll的多个实例?有没有更好的方式将XML数据从delphi传输到PHP?

对不起,稍长的问题,任何帮助表示赞赏

(PS。我知道德尔福代码应该重构,但是这将意味着6个月“循环引用” -hell :)

回答

0

的只有这样才能解决这个问题,就是在delphi部分和php部分之间放置一些中间件,这些中间件会收集请求,并将它们放入队列并使用delphi代码逐个处理它们。也许你可以重构php部分以异步显示数据 - 这样php进程可以快速返回并向用户显示某种“正在加载......请稍候”消息,然后由ajax继续尝试检索数据直到它可以从中间件获得(例如,php脚本可以将请求与session_id一起放入数据库表中,中间件部分可以逐个处理来自该表的每个请求,同时将检索到的数据写回到表中。 ,ajax请求可以继续查询表,直到数据可用)。

1

您可以模拟CGI,甚至可以使用CGI。基本上你需要一个监视传入请求并为每个新用户创建一个会话的服务器。然后每个会话启动一个加载DLL的新进程。该进程只是该问题DLL的沙箱。

所以,你有以下几个部分:

  1. 服务器(HTTP,TPC,SOAP什么...)
  2. 客户端沙盒进程
  3. 你的DLL

客户端进程只是一个虚拟进程,其唯一目的是加载DLL并作为DLL和服务器之间的通信桥梁。使用IPC(进程间通信)委托服务器(会话)和持有该DLL的沙盒进程之间的通信。通过这种方式,您可以为每位客户隔离流程,并获得系统稳定性。一个DLL的失败并不是整个系统的失败。

许多系统nowdays以这种方式工作:

  1. CGI
  2. 谷歌浏览器
  3. 最新的IIS和Apache ISAPI ...

只是要小心有一个会话限制,否则许多进程可能会催生主机操作系统。有关工艺限制的参考,请阅读Mark Russinovich的博客文章:

Pushing the Limits of Windows: Processes and Threads

相关问题