我想问问是否可以在 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功能。两者匹配的可能性很高。
备选
另一种方法是使用套接字。乍一看,使用网络堆栈进行进程间通信可能有点矫枉过正,但这有两个明显的优点:
- 本地主机上的通信速度很快。我亲自在 Windows 机器上进行了测试,将其与真实的共享内存进行了比较。网络解决方案开销与单个
memcpy()
调用相当。 - 网络代码本质上是兼容的,Qt 和 PHP 都非常适合这种类型的通信。
关于php - PHP 和 QT 之间的共享内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34860314/