PHP和QT之间的共享内存

时间:2016-01-18 17:10:14

标签: php c++ qt

我想询问是否可以在qt-application和php-script之间创建共享内存。

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

qt - side

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 - side

<?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)

提前致谢!

1 个答案:

答案 0 :(得分:2)

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

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

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

替代

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

  1. 通过localhost进行通信很快。我个人在Windows机器上进行了测试,将它与真正的共享内存进行了比较。网络解决方案开销与单个memcpy()呼叫的开销相当。
  2. 网络代码本质上是兼容的,Qt和PHP都非常适合这种类型的通信。