2009-08-27 7 views
2

웹 응용 프로그램의 백엔드 (간단한 램프 설정)에 대한 보고서를 생성하는 간단한 C++ 응용 프로그램이 있습니다. 문제는 백엔드가 메모리에서 약 1.5GB를 차지하는 데이터 파일을로드한다는 것입니다. 여러 사용자가 동시에 여러 프로그램을 실행하는 경우에는 확장되지 않습니다. 따라서 내 생각에 여러 프로그램으로 분할하는 것이 좋습니다.

프로그램 A는 항상 서버에서 실행되는 기본 실행 파일이며 항상로드 된 데이터가 있습니다. 실제로 보고서를 실행할 수 있습니다.

프로그램 B는 PHP에서 생성되며 A 프로그램에 필요한 정보를 얻기 위해 간단한 요청을하고 데이터를 반환합니다.

내 질문은 다음과 같습니다. B에게 A에게 무언가를하도록 요청하는 좋은 방법은 무엇입니까? A가없는 경우 어떻게 작동해야합니까? 나는 정말로 작업을 위해 폴링하거나 그렇지 않으면 내 타이어를 돌리고 싶지 않습니다.C++의 프로세스 간 통신

+0

죄송합니다 ...이 모든 것이 Linux에서 실행 중입니다. – captncraig

+1

램프를 언급했기 때문에 linux 태그를 추가했습니다. IPC는 플랫폼에 따라 다르기 때문에 이것이 중요합니다. –

답변

4

명명 된 뮤텍스/이벤트를 사용하면 기본적으로 하나의 스레드 (사용자의 경우 프로세스 A)가 기다리고 기다리는 것을 허용합니다. 그런 다음 프로세스 B가 진행되고 무언가 완료 될 필요가 있고 프로세스 A를 깨우는 뮤텍스/이벤트를 알리고 작업을 진행합니다.

당신은 마이크로 소프트에있는 경우 :

Mutex, 리눅스에 Event

IPC가 다르게 작동하지만, 같은 기능이 있습니다

Linux Stuff

또는 다른 방법으로, C를 들어 ++ 당신 부분 멀티 플랫폼 인 boost IPC 라이브러리 중 하나를 사용할 수 있습니다. 나는 PHP가 무엇을 사용할 수 있는지 잘 모르겠지만 의심 할 여지가 뭔가 동등한 것입니다.

+1

+1 네트워크 카드를 칠 필요가 없습니다. 특히 동일한 상자에서 웹 서버를 실행하는 경우에는 특히 그렇습니다. – Alex

+0

+1 부스트 프로세스를 언급합니다. http://www.boost.org/doc/libs/1_39_0/doc/html/interprocess.html – Laserallan

+0

감사! Boost 메시지 대기열 쌍을 사용하려고합니다. – captncraig

2

localhost에서 실행되는 TCP 소켓을 사용하십시오.

  1. C++ 응용 프로그램을 데몬으로 설정하십시오.
  2. PHP 프론트 엔드는 데몬에 대한 지속적인 연결을 생성합니다. pfsockopen
  3. 요청이있을 때, PHP는 데몬에게 요청을 보내서 데몬에게 모든 요청을 처리하고 보냅니다. PHP SocketsC++ Sockets

편집

추가를 참조 할 수 있도록 몇 가지 링크. 이 정말 좋지 않을 수도 있습니다. 어딘가에 프로세스 간 통신 소켓을 사용하는 C 코드이지만 아무 것도 쓸모가 없습니다.

+0

재미있는 것 같습니다. 그러나 오히려 내게 외딴 소리. 이 사용에 대한 좋은 참조 나 예를 알고 있습니까? – captncraig

2

IPC는 C++에서 쉽게 사용할 수 있으며 POSIX C API를 호출하기 만하면됩니다.

그러나 여러분이 묻는 것은 큐 관리자가 훨씬 잘 처리 할 수 ​​있습니다. 백그라운드 데몬이 대기열에있는 메시지를 기다리도록하고 프론트 엔드 PHP는 처리하고자하는 작업의 스펙을 추가합니다. 일부 큐 관리자는 타스크의 결과를 동일한 오브젝트에 추가하거나 완료 메시지에 대한 새 큐를 정의 할 수 있습니다.

가장 잘 알려진 고성능 큐 관리자 중 하나는 RabbitMQ입니다. 아주 사용하기 쉬운 또 하나는 MemcacheQ입니다.

또는 작업을 위해 MySQL에 테이블을 추가 할 수 있습니다. 백그라운드 프로세스는 주기적으로 미완성 테이블을 쿼리합니다. 이것은 작동하며 매우 안정적 일 수 있지만 (가끔씩 빈민굴 대기열이라고도 함) 높은 작업/초로 고장납니다.

+0

그래, 메시지 큐가 내가 사용하기를 원하는 것처럼 들린다. 메시지가 없을 때 백그라운드 프로세스가 블로킹 할 수있게 해주고 그렇지 않으면 잘 작동 할 것입니다. 감사! – captncraig