Начиная с нескольких дней, я пытаюсь выполнить следующее: у меня есть крошечная программа на 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 ...
Но я не знаю, какой ключ, режим, безопасность и размер я должен установить!
Теперь, прежде чем вы что-нибудь напишете, я использую «MapViewOfFileEx ()», потому что я хотел бы установить фиксированный адрес, чтобы PHP мог читать с фиксированного адреса. Я также пробовал это с помощью «0x00030000» как на C ++, так и на PHP. C ++ смог создать FileMapping, но PHP не может получить доступ к сообщению об ошибке: shmop_open (): невозможно подключиться или создать сегмент разделяемой памяти. В качестве $ mode я устанавливаю «a» только для разрешений на чтение. Как $ security я установил 0777 для доступа всех … В качестве $ size я установил 10 байт.
Как написано в PHP-руководстве, они говорят, что я должен установить 0 для $ security AND $ size, если я пытаюсь подключиться к существующей разделяемой памяти, но это также не работает.
Как я могу получить эту концепцию? Я предполагаю, что BaseAdress C ++ не такой же, как ключ $ в PHP, но как я могу сказать PHP, где находится блок с разделяемой памятью? Если это невозможно сделать, это будет работать: будет ли другой способ передачи данных с программы на C ++ на PHP (работает на wamp-сервере)?
PS: как я недавно читал в других вопросах, кажется, что невозможно общаться с разделяемой памятью … Я никогда раньше не работал с named-pipe, но как бы моя проблема была реализована с использованием named-pipe? Или есть лучший / более быстрый способ обеспечения связи между C ++ и PHP?
Я бы рекомендовал вам использовать Redis для связи с C ++ и PHP. Вы можете использовать его Pub / sub модуль, очень мощный. http://redis.io/topics/pubsub . Здесь у вас есть список клиентов для redis: http://redis.io/clients