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

4

最近几天,我一直在尝试让以下事情正常工作: 我有一个小的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 ++程序传输到运行在Wamp服务器上的PHP? PS:正如我最近在其他问题中阅读的那样,似乎无法与共享内存通信...我以前从未使用过命名管道,但是如果使用命名管道,我的问题将如何得到解决?或者是否有更好/更快速的方法可以使C ++和PHP之间进行通信?

1
我无法提供关于共享内存的帮助,但如果您确实需要在C++代码和PHP之间进行通信,您可能需要考虑编写一个PHP扩展。 - Mahn
@Mahn uff!编写自己的PHP扩展会非常有趣,但我不知道该如何做!你有什么提示可以告诉我吗? :-) - SaschaP
2
不是这样的。您可以使用例如dio扩展来直接访问串口。我们在PHP中创建了许多命令行和守护程序解决方案,其中一些正在与GSM调制解调器实时通信 - 一切都完美地运作,并且没有消耗太多资源。 - mlask
@Mahn,无论如何感谢您提供这个线索,我以前从未想过! - SaschaP
1
我不得不做这样的事情,为了避免这里已经提到的所有问题,我放弃了,只是写了一个第三方应用程序,将共享内存读入 SQL 数据库中,以供 PHP 经常访问。这并不是建议做法,不是最佳实践,你的同事会指着你笑,给你起傻名字,它永远不会通过代码审查,但在一天结束时它确实可以工作。 - Mark
显示剩余6条评论
1个回答

0

这看起来非常不错!但是我在那里读到需要使用C++ Redis客户端的boost...也许我会尝试一下!谢谢 - SaschaP

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接