php和boost库IPC如何通信?
Posted
技术标签:
【中文标题】php和boost库IPC如何通信?【英文标题】:How to communicate between php and boost library IPC? 【发布时间】:2012-06-07 15:46:42 【问题描述】:我在 php 中有客户端和服务器通过共享内存进行通信,现在我想使用 Boost.Interprocess 访问这个碎片内存对象,我该如何访问它? 服务器.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, 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, 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, "a",
0644,1024*4
);
$s=shmop_size($shm_id);
$data = unserialize(
shmop_read( $shm_id, 0,
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 提供什么样的密钥来获取这个内存区域?
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 library Docs 中找到了解决方案:
XSI_KEY based example from boost Docs
【问题讨论】:
PHP扩展使用了System V IPC key,那么boost用的是哪一个呢? 是的,但它是如此隐藏在幕后。 “隐藏在幕后”是什么意思? 有一个类负责 ftok() 调用,您不是直接调用 ftok 从文件名中获取 IPC 密钥,请参见我的编辑中的示例。 你应该用你找到的解决方案发布答案。 【参考方案1】:我不是你在做什么的专家,但根据我在你的问题和我的知识中读到的内容,我会放弃那个纯粹的 IPC 东西并将其包装到 ZMQ 中(你会在每个您需要的语言)。它旨在解决这类问题,并提供可以在 IPC 或更常见的 TCP 套接字上运行的单一 API。
【讨论】:
以上是关于php和boost库IPC如何通信?的主要内容,如果未能解决你的问题,请参考以下文章