며칠 전부터 다음과 같은 작업을하고 있습니다. 직렬 포트에서 데이터를 연속적으로 읽는 작은 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 사이의 통신을 가능하게하는 더 좋고/더 빠른 방법이 있습니까?
직렬 포트에서 읽기 전용으로 cpp 프로그램 (?)을 사용해야하는 특별한 이유가 있습니까? – mlask
공유 메모리와 관련하여 도움을 줄 수는 없지만 C++ 코드와 PHP 사이의 통신이 절대적으로 필요한 경우 PHP 확장을 작성하는 것이 좋습니다. – Mahn
@ mlask 특별한 이유는 없지만 C++과 공유 메모리로 작업 해 왔습니다. 또한 PHP로 직렬 포트 데이터를 읽는 가능성을 찾았지만 C++의 다른 기능이 필요합니다. PHP로 직렬 포트에서 데이터를 계속 읽는 것은 CPU를 많이 사용합니다. 편집 : 나는 매초마다 AJAX-Request를 할 것이고, PHP가 포트를 열고 데이터를 읽고, 처리하고, 다시 포트를 닫는 데 너무 느릴 것이라고 걱정한다. – SaschaP