2014-06-05 3 views
4

며칠 전부터 다음과 같은 작업을하고 있습니다. 직렬 포트에서 데이터를 연속적으로 읽는 작은 C++ 프로그램이 있습니다. 이 데이터는 다음과 같이 공유 메모리에 저장됩니다PHP - C++로 생성 된 공유 메모리에 액세스

HANDLE hMapFile; 
hMapFile = CreateFileMapping(
    INVALID_HANDLE_VALUE, 
    NULL, 
    PAGE_READWRITE, 
    0, 
    10, 
    NULL); 

LPCTSTR pBuf; 
pBuf = (LPTSTR) MapViewOfFileEx(
    hMapFile, 
    FILE_MAP_ALL_ACCESS, 
    0, 
    0, 
    10, 
    NULL); 

while(true) 
{ 
    //... some code ... 
    CopyMemory((PVOID)pBuf, szMsg, (_tcslen(szMsg) * sizeof(TCHAR))); 
    //... some code ... 
} 

지금 내가 PHP와이 공유 메모리에 액세스하고 싶습니다. 그래서 나는 다음을 시도했다 :

$shm_id = shmop_open($key, $mode, $security, $size); 
$read = shmop_read($shm_id, 0, 10); 
//... some code ... 

그러나 어떤 키, 모드, 보안 및 크기를 설정해야할지 모르겠다!

이제 무언가를 쓸 것입니다 : PHP가 고정 주소에서 읽을 수 있도록 고정 주소를 설정하고 싶기 때문에 "MapViewOfFileEx()"를 사용합니다. C++과 PHP 모두에서 "0x00030000"을 사용하여이 작업을 시도했습니다. C++은 FileMapping을 만들 수 있었지만 PHP는 오류 메시지를 제공하지 않습니다. shmop_open() : 공유 메모리 세그먼트를 첨부하거나 만들 수 없습니다. $ mode i는 읽기 권한 만 "a"로 설정합니다. $ security로 모든 액세스에 대해 0777을 설정했습니다. $ size로 10 바이트를 설정했습니다.

PHP 매뉴얼에 쓰여 있듯이 기존의 공유 메모리에 연결하려고하면 $ security와 $ size를 0으로 설정해야하지만이 방법도 작동하지 않습니다.

어떻게하면이 개념을 완성 할 수 있습니까? 나는 C++의 BaseAdress가 PHP의 $ 키와 같지 않다고 생각하지만 PHP에 공유 메모리 블록의 위치를 ​​알려주려면 어떻게해야합니까? 이 작업을 수행하는 것이 불가능한 경우 : C++ 프로그램에서 PHP로 데이터를 전송하는 또 다른 방법이 있습니까 (wamp-server에서 실행 중입니까?).

추신 : 최근에 다른 질문을 읽었을 때 공유 메모리와 통신하는 것이 불가능한 것 같습니다. 전에 named 파이프로 작업 한 적이 없지만 명명 된 파이프를 사용하여 어떻게 문제가 실현 될 수 있습니까? 아니면 C++과 PHP 사이의 통신을 가능하게하는 더 좋고/더 빠른 방법이 있습니까?

+0

직렬 포트에서 읽기 전용으로 cpp 프로그램 (?)을 사용해야하는 특별한 이유가 있습니까? – mlask

+1

공유 메모리와 관련하여 도움을 줄 수는 없지만 C++ 코드와 PHP 사이의 통신이 절대적으로 필요한 경우 PHP 확장을 작성하는 것이 좋습니다. – Mahn

+0

@ mlask 특별한 이유는 없지만 C++과 공유 메모리로 작업 해 왔습니다. 또한 PHP로 직렬 포트 데이터를 읽는 가능성을 찾았지만 C++의 다른 기능이 필요합니다. PHP로 직렬 포트에서 데이터를 계속 읽는 것은 CPU를 많이 사용합니다. 편집 : 나는 매초마다 AJAX-Request를 할 것이고, PHP가 포트를 열고 데이터를 읽고, 처리하고, 다시 포트를 닫는 데 너무 느릴 것이라고 걱정한다. – SaschaP

답변

0

Redis를 사용하여 C++과 PHP 간의 통신을 처리하는 것이 좋습니다. 그의 Pub/Sub 모듈을 사용할 수 있습니다. 매우 강력합니다. http://redis.io/topics/pubsub. 여기에 redis에 대한 클라이언트 목록이 있습니다 : http://redis.io/clients

+0

이것은 매우 멋져 보인다! 그러나 내가 거기에서 읽었을 때 나는 C++ Redis-Clients를 사용하기 위해 부스트가 필요할 것입니다 ... 어쩌면 그것을 시도해 볼 것입니다! 고맙습니다 – SaschaP

관련 문제