PHP - 访问使用C ++创建的共享内存

时间:2014-06-05 10:59:36

标签: php c++ ipc shared-memory

因为几天我试图让以下事情发挥作用: 我有一个很小的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-manual中所述,他们说我应该为$ security和$ size设置0,如果我试图连接到现有的共享内存,但这也无效。

我怎样才能完成这个概念?我猜C ++的BaseAdress和PHP中的$ key不一样,但是 我怎么能告诉PHP然后共享内存块在哪里? 如果这不可能实现这一点:是否有另一种方法将数据从C ++程序传输到PHP(在wamp-server上运行)?

PS:正如我最近在其他问题中看到的那样,似乎无法与共享内存进行通信......我以前从未使用过命名管道,但是如何使用命名管道实现我的问题?或者是否有更好/更快的方式来启用C ++和PHP之间的通信?

1 个答案:

答案 0 :(得分:0)

我建议您使用Redis来处理C ++和PHP之间的通信。 你可以使用他的Pub / sub模块,非常强大。 http://redis.io/topics/pubsub。 您在这里有redis的客户列表:http://redis.io/clients