php - PHP 和 QT 之间的共享内存

标签 php c++ qt

我想问问是否可以在 qt 应用程序和 php 脚本之间创建共享内存。

我环顾四周,得出了以下(非常简单)的想法:

qt - 边

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    unsigned char data[5] = {1,2,3,4,5};
    QSharedMemory smem;
    smem.setNativeKey("12345");
    qDebug() << smem.nativeKey();

    if(smem.create(4096)){
        qDebug() << "SharedMemory created.";
        char *to = (char*)smem.data();
        memcpy(to,data,5);
    }
    return a.exec();
 }

php - 端

<?php
        $shm_ = shmop_open("12345", "w", 0,0);

        if($shm_==FALSE){
            echo "SHM Open Failed!";
        }else{
            $shm_s = shmop_size($shm_);
            echo "SHM Open Succ! [Size : ".$shm_s."]<br>";
            $data_read = shmop_read($shm_,0,5);
            shmop_close($shm_);
        }

?>

但是这种方法失败了。 shmop_open() 表示:无法附加或创建共享内存。 (在 windows/qt ver.5.5 上运行 xampp)

提前致谢!

最佳答案

理论上这似乎是可能的。然而实际上,由于不同平台的不同共享内存实现,这通常是不够的。 Qt 在其他系统特定 API(在不同平台上有所不同)之上实现了自己的 QSharedMemory 类。 PHP 也可以做同样的事情。

您需要找到两端兼容的技术。寻找最特定于操作系统的方法,因为可能存在共同点。我在 Linux 平台上经验不足,但是:

对于 Windows 平台,我找到了 this SO question它描述了 PHP 中基于文件的共享内存。在 Qt 方面,您可以使用 normal Windows API功能。两者匹配的可能性很高。

备选

另一种方法是使用套接字。乍一看,使用网络堆栈进行进程间通信可能有点矫枉过正,但这有两个明显的优点:

  1. 本地主机上的通信速度很快。我亲自在 Windows 机器上进行了测试,将其与真实的共享内存进行了比较。网络解决方案开销与单个 memcpy() 调用相当。
  2. 网络代码本质上是兼容的,Qt 和 PHP 都非常适合这种类型的通信。

关于php - PHP 和 QT 之间的共享内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34860314/

相关文章:

c++ - 新窗口不显示

javascript - 如何在 QML 中的 50 个文本字段之间切换焦点?

php - 我想用 mysqldump 备份表的最后记录

c++ - 数字序列的 MD5 散列

c++ - 如何在c++中检查文件是否存在于Qt中

c++ - 多重继承和可变参数模板

c++ - 传感器数据收集 C 守护进程困境

php - 如何修复 PHP 中的内存泄漏

PHP/SQL : If statement within the query?

php - 通过 PHP 返回图像并使用 AJAX 设置为 src