Intereting Posts
взорвать строку и установить ключ для массива с текстом, который находится перед разделителем? Symfony Предупреждение: SessionHandler :: read (/ Applications / XAMPP / xamppfiles / temp / …): open failed Permission denied Как найти mime-тип файла с php? Почему функция override_function возвращается как неопределенная функция Не удается найти индекс FULLTEXT, соответствующий списку столбцов (установлены индексы) Сбой запроса SQL LIKE – фатальная ошибка в подготовленном сообщении как объединить json закодированные массивы, возвращенные из parallelcurl в PHP Внезапно возникает ошибка 502 Bad Gateway переменные сеанса не установлены в первый раз Могу ли я создать базу данных с использованием PDO в PHP? Ошибка PDO: prepare () с несколькими запросами не работает внутри транзакции Как обновить SimpleXMLElement с помощью массива Автоматически вставлять строки в нужную длину на вставку Ключевые слова PoEdit – множественное число Невозможно сбросить запрос, чтобы показать сообщение ramdom после первого цикла WordPress

PHP – доступ к общей памяти, созданной с помощью C ++

Начиная с нескольких дней, я пытаюсь выполнить следующее: у меня есть крошечная программа на 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