PHP 和 QT 之间的共享内存

Shared Memory between PHP an QT

本文关键字:共享 内存 之间 QT PHP      更新时间:2023-10-16
我想

问一下是否可以在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上运行XAMPP/Qt ver.5.5)

提前感谢!

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

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

对于Windows平台,我发现了这个SO问题,它描述了PHP中基于文件的共享内存。在Qt端,你可以使用普通的Windows API函数。两者很有可能匹配。

另类

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

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