繁体   English   中英

PHP和QT之间的共享内存

[英]Shared Memory between PHP an 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版本5.5上运行Xampp)

提前致谢!

从理论上讲,这似乎是可能的。 但是实际上,由于不同平台的共享内存实现方式不同,因此通常无法满足要求。 Qt在其他系统特定的API(在不同的平台上有所不同)之上实现了自己的QSharedMemory类。 PHP可能会这样做。

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

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

替代

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM