【发布时间】:2014-07-26 08:13:06
【问题描述】:
几天以来,我试图让以下事情发挥作用: 我有一个很小的 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 可以从固定地址读取。 我还在 C++ 和 PHP 中使用“0x00030000”进行了尝试。 C++ 能够创建 FileMapping,但 PHP 无法访问并给出错误消息:shmop_open():无法附加或创建共享内存段。 作为 $mode,我将“a”设置为仅读取权限。 作为 $security 我将 0777 设置为所有访问权限... $size 我设置为 10 字节。
正如 PHP 手册中所写,他们说如果我试图附加到现有的共享内存,我应该将 $security 和 $size 设置为 0,但这也不起作用。
我怎样才能完成这个概念?我猜C++的BaseAdress和PHP中的$key不一样,但是 那么我如何告诉 PHP 共享内存块在哪里? 如果这是不可能的:是否有另一种方法可以将数据从 C++ 程序传输到 PHP(在 wamp-server 上运行)?
PS:正如我最近在其他问题中所读到的,与共享内存进行通信似乎是不可能的......我以前从未使用过命名管道,但是如何使用命名管道来解决我的问题?还是有更好/更快的方式来实现 C++ 和 PHP 之间的通信?
【问题讨论】:
-
你有什么特别的理由只使用cpp程序(?)从串口读取?
-
关于共享内存我无能为力,但如果您绝对需要 C++ 代码和 PHP 之间的通信,您可能想考虑编写一个 PHP 扩展。
-
@mlask 没有特别的原因,但我以前使用 C++ 处理过共享内存。我还寻找使用 PHP 读取串行端口数据的可能性,但我还需要 C++ 的其他功能,我猜想使用 PHP 从串行端口连续读取数据非常占用 CPU。编辑:我将每秒执行一次 AJAX 请求,我担心 PHP 会太慢而无法获取和打开端口、读取数据、处理它然后再次关闭端口......
-
不,不是。例如,您可以使用
dio扩展名直接 IO 访问串行端口。我们在 PHP 中创建了许多命令行和守护程序解决方案,其中一些正在与 GSM 调制解调器进行实时通信 - 一切都运行良好且不占用太多资源。 -
我不得不做这样的事情,为了避免这里已经提到的所有问题,我放弃了,只是写了第三个应用程序来将共享内存读入 SQL 数据库供 PHP 访问经常和尽可能频繁地需要。不建议这样做,这不是最佳实践,您的同事会指着您嘲笑您,并称您为愚蠢的名字,并且它永远不会通过代码审查,但最终它确实有效。
标签: php c++ ipc shared-memory