2010-04-15 2 views
0

델파이 2007로 만든 "ActiveX 라이브러리"프로젝트가 있습니다. 라이브러리 인터페이스는 입력 값을 기반으로 XML 데이터를 반환합니다. 이것은 웹 페이지에 데이터를 표시하는 PHP 스크립트에 의해 사용됩니다. 위대한 작품!델파이에서 dll의 여러 프로세스를 시작하십시오.

문제는 서버에서 dll 프로세스의 인스턴스 하나만 실행할 수 있다는 것입니다. 그러나 보안상의 이유로 각 고객은 자신의 dll 프로세스를 액세스 할 수 있어야합니다 (dll은 항상 하나의 데이터베이스에만 연결되기 때문에).

또한 델파이 코드가 작성되는 방식 때문에 다중 스레드를 지원하지 않습니다. (그것은 싱글 톤 클래스를 많이 사용하는 100 000+ 라인 프로젝트 임)

같은 dll의 여러 인스턴스를 시작할 수있는 방법이 있습니까? 델파이에서 PHP로 XML 데이터를 전송하는 더 좋은 방법이 있습니까? 기름 한 질문에 대한 죄송합니다

는, 어떤 도움

을 감사

(PS. I는 델파이 코드가 리팩토링해야하지만,이 "순환 참조"해석 - 그것도 :)

답변

0

을 6 개월을 의미 알고 내가 이것을 해결할 수있는 유일한 방법은 델파이 부분과 PHP 부분 사이에 어떤 종류의 미들웨어를 넣어 요청을 수집하고 큐에 넣은 다음 델파이 코드를 사용하여 하나씩 처리하는 것입니다. 어쩌면 당신은 PHP 부분을 비동기 적으로 보여주기 위해 PHP 부분을 리팩터링 할 수 있습니다. PHP 프로세스가 신속하게 리턴되고 일종의 "Loading .. please wait"메시지를 사용자에게 보여줄 수 있습니다. 그런 다음, 아약스가 데이터 검색을 계속 시도합니다. 미들웨어에서 사용할 수있을 때까지 (예를 들어 PHP 스크립트가 session_id와 함께 데이터베이스 테이블에 요청을 넣을 수 있고 미들웨어 부분이 해당 테이블의 각 요청을 하나씩 처리하여 검색된 데이터를 다시 테이블에 기록 할 수 있습니다.) , Ajax 요청은 데이터가 사용 가능할 때까지 테이블을 계속 u 리할 수 있습니다).

1

CGI를 시뮬레이트하거나 CGI를 사용할 수도 있습니다. 기본적으로 들어오는 요청을 감시하고 각각의 새 사용자에 대해 세션을 만드는 서버가 필요합니다. 그런 다음 각 세션은 DLL을로드하는 새 프로세스를 시작합니다. 프로세스는 해당 DLL에 대한 샌드 박스 일뿐입니다.

  1. 서버 (HTTP, TPC, SOAP 어떤 ...)
  2. 클라이언트 샌드 박스 처리
  3. 귀하의 DLL

클라이언트 :

그래서 다음과 같은 부분이 프로세스는 DLL을로드하는 유일한 목적이며 DLL과 서버 간의 통신 브리지 역할을하는 더미 프로세스입니다. IPC (프로세스 간 통신)를 사용하여 서버 (세션)와 DLL을 보유하고있는 샌드 박스 프로세스 간의 통신을 위임합니다. 이렇게하면 각 고객에 대한 프로세스가 분리되고 시스템 안정성이 향상됩니다. 하나의 DLL이 실패하더라도 전체 시스템이 실패하지는 않습니다.

많은 시스템 nowdays이 방식으로 작동 :

  1. CGI
  2. 구글 크롬
  3. 최신 IIS와 아파치 ISAPI 을 ...

세션 제한이 있으면주의해야합니다. 그렇지 않으면 많은 프로세스가 호스트 OS를 다운시키면서 생성 될 수 있습니다. 프로세스 제한에 대한 참조는 Mark Russinovich의 위대한 블로그 게시물을 참조하십시오.

Pushing the Limits of Windows: Processes and Threads

관련 문제