我有客户端和服务器在PHP通过共享内存通信,现在我想访问这个shred内存对象使用Boost.Interprocess如何访问它?
server.PHP:
server.PHP:
function create_image($str){
// Create a blank image and add some text
$im = imagecreatetruecolor(300,20);
$text_color = imagecolorallocate($im,233,14,91);
$stringBanner=exec("date").$str;
imagestring($im,1,5,$stringBanner,$text_color);
ob_start();
imagejpeg($im);
$i = ob_get_contents();
ob_get_clean();
imagedestroy($im);
return $i;
}
echo "\n".__FILE__."\n";
$shm_key = ftok(__FILE__,'t');
echo $shm_key."\n";
$shm_id = shmop_open($shm_key,"a",0);
if ($shm_id) {
//it is already created
shmop_delete($shm_id);
shmop_close($shm_id);
}
//you need to create it with shmop_open using "c" only
echo "try to create\n";
if(!$shm_id = shmop_open($shm_key,"c",0777,1024*4))exit(-1);
echo "ID ".$shm_id."\n";
$i=0;
for(;;){
sleep(1);
$s="i=".$i++;
$str=$i;
$im=serialize(create_image($str));
$data=serialize(strlen($im));
$shm_bytes_written = shmop_write($shm_id,$data,0);
$shm_bytes_written = shmop_write($shm_id,$im,32);
echo $shm_bytes_written." bytes is written: ".$s." ID = $shm_id\n";
}
client.PHP
<?PHP
$shm_key =1946222626;// ftok(__FILE__,'t');
$shm_id = shmop_open(
$shm_key,0644,1024*4
);
$s=shmop_size($shm_id);
$data = unserialize(
shmop_read( $shm_id,31)
);
$im = unserialize(
shmop_read( $shm_id,32,$data)
);
// Set the content type header - in this case image/jpeg
header('Content-Type: image/jpeg');
// Output the image
echo $im;
我应该提供什么样的关键技术来提升这个记忆区域?
boost_client.cpp
#include <boost/interprocess/shared_memory_object.hpp>
#include <iostream>
#include "sys/msg.h"
int main()
{
int msqid;
key_t key;
char f[]="??????";
int mid;
//key = ftok(,'t');
//msqid = msgget(key,0666 | IPC_CREAT);
std::cout<<msqid<<std::endl;
boost::interprocess::shared_memory_object
shdmem(boost::interprocess::open_or_create,f,//"shmem_server",boost::interprocess::read_write);
shdmem.truncate(1024);
std::cout << shdmem.get_name() << std::endl;
boost::interprocess::offset_t size;
if (shdmem.get_size(size))
std::cout << size << std::endl;
}
编辑:
那么我在Boost IPC库中找到了解决方案文档:
XSI_KEY based example from boost Docs
我不是你在做什么的专家,但是从我在问题和我的知识中读到的东西,我会把那个纯IPC的东西放到
ZMQ(你会发现你需要的每个语言的包装器).这意味着要解决这些问题,并提供可以运行在IPC或更常见的TCP套接字上的单一API.