Запустите несколько процессов DLL в Delphi - PullRequest
0 голосов
/ 15 апреля 2010

У меня есть проект «Библиотека ActiveX», созданный в Delphi 2007. Интерфейс библиотеки возвращает данные XML на основе входных значений. Затем он используется сценарием PHP, который отображает данные на веб-странице. Это прекрасно работает!

Проблема в том, что я могу запустить только один экземпляр процесса dll на сервере. Однако по соображениям безопасности каждый мой клиент должен иметь доступ к своему собственному процессу dll (поскольку dll всегда подключена только к одной базе данных).

Кроме того, из-за способа создания кода Delphi он не поддерживает несколько потоков. (Это проект на 100 000 строк с использованием большого количества классов-одиночек)

Есть ли способ запустить несколько экземпляров одной и той же DLL? Есть ли лучший способ передачи данных XML из Delphi в PHP?

Извините за длинный вопрос, любая помощь приветствуется

(пс. Я знаю, что код Delphi должен быть реорганизован, но это будет означать 6 месяцев «циклической ссылки» -оболочка)

Ответы [ 2 ]

1 голос
/ 15 апреля 2010

Вы можете симулировать CGI или даже использовать CGI. В основном вам нужен сервер, который отслеживает входящие запросы и создает сеанс для каждого нового пользователя. Затем каждый сеанс запускает новый процесс, который загружает DLL. Процесс - просто песочница для рассматриваемой DLL.

Итак, у вас есть следующие части:

  1. Сервер (HTTP, TPC, SOAP, что угодно ...)
  2. Процесс песочницы клиента
  3. Ваша DLL

Клиентский процесс - это просто фиктивный процесс, единственной целью которого является загрузка DLL, и он действует как мост связи между DLL и сервером. Используйте IPC (межпроцессное взаимодействие) для делегирования связи между сервером (сеансами) и изолированными процессами, содержащими DLL. Таким образом, у вас есть отдельные процессы для каждого клиента, и вы получаете стабильность системы. Отказ одной DLL не является отказом всей системы.

Многие современные системы работают так:

  1. CGI
  2. Google Chrome
  3. Последние IIS и Apache ISAPI ...

Просто будьте осторожны, чтобы иметь ограничение сеанса, в противном случае многие процессы могут быть запущены, что приведет к отключению ОС хоста. Для справки об ограничениях процесса читайте большое сообщение в блоге Марка Руссиновича:

Расширение границ Windows: процессы и потоки

0 голосов
/ 15 апреля 2010

Единственный способ решить эту проблему - поместить какое-то промежуточное программное обеспечение между частью delphi и частью php, которая будет собирать запросы, помещать их в очередь и обрабатывать их один за другим, используя код delphi. может быть, вы могли бы реорганизовать часть php для асинхронного отображения данных - таким образом процесс php мог быстро вернуться и показать пользователю какое-то сообщение «Идет загрузка ... пожалуйста, подождите», и после этого, с помощью ajax, продолжайте пытаться получить данные пока он не будет доступен из промежуточного программного обеспечения (например, скрипт php может поместить запрос в таблицу базы данных вместе с session_id, а часть промежуточного программного обеспечения может обрабатывать каждый запрос из этой таблицы один за другим, записывая полученные данные обратно в таблицу. запрос ajax может продолжать запрашивать таблицу до тех пор, пока данные не станут доступны).

...