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上运行XAMPP/Qt ver.5.5)
提前感谢!
从理论上讲,这似乎是可能的。然而,实际上,由于不同平台的共享内存实现不同,这通常不足。Qt在其他系统特定的API之上实现自己的QSharedMemory
类(在不同的平台上是不同的)。PHP 也可以这样做。
您需要找到两端兼容的技术。注意最特定于操作系统的方法,因为可能存在共同点。我在 Linux 平台上没有经验,但是:
对于Windows平台,我发现了这个SO问题,它描述了PHP中基于文件的共享内存。在Qt端,你可以使用普通的Windows API函数。两者很有可能匹配。
另类
另一种方法是使用套接字。乍一看,使用网络堆栈进行进程间通信可能看起来有点矫枉过正,但这有两个明显的优势:
- 通过本地主机进行通信速度很快。我亲自在Windows机器上进行了测试,将其与真正的共享内存进行了比较。网络解决方案开销与单个
memcpy()
呼叫的开销相当。 - 网络代码本质上是兼容的,Qt和PHP都非常适合这种类型的通信。
相关文章:
- 使用Boost Interprocess创建托管共享内存需要很长时间
- 字符串共享内存映射的向量
- CUDA 使用共享内存平铺 3D 卷积实现
- 共享内存:MapViewOfFile 返回错误 5
- 如何在多写入器情况下对文件支持的共享内存中的大页面出错
- 有没有办法列出所有共享内存对象的名称?
- 共享内存的升压容器是否实现锁定?
- 共享内存中的健壮互斥锁不是那么健壮
- 使用IPC/共享内存将Integer数组从C++传递到Python
- 共享内存和性能
- 在这种特殊情况下,我是否需要在共享内存中使用原子类型
- 是否可以在专用内存空间中分配一个为提升管理共享内存而创建的对象
- fork(),在C中共享内存和指针
- 访问共享内存而不使用易失性、std::atomic、信号量、互斥锁和自旋锁
- 提升进程间共享内存open_or_create每次都会引发异常
- 通过 mmap-ed 共享内存传递可变长度 C 字符串
- 越界访问 CUDA 共享内存
- 在共享内存中插入映射映射时出现编译器错误
- 矩阵矢量产品 CUDA 通过平铺和共享内存提高性能
- 如何更改在 c++ 中使用提升库创建的共享内存的路径