2010-04-15 67 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

相關問題