【问题标题】:PHP - Access shared Memory created with C++PHP - 访问使用 C++ 创建的共享内存
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 这看起来很不错!但是当我在那里阅读时,我需要提升才能使用 C++ Redis-Clients ......也许我会试一试!谢谢
猜你喜欢
  • 1970-01-01
  • 2014-04-21
  • 2021-11-26
  • 1970-01-01
  • 2015-05-22
  • 2019-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多