2012-06-02 13 views
13

Paylaşılan bellek üzerinden iletişim kurarken istemci ve sunucum var, Şimdi Boost.Interprocess kullanarak bu parçalanmış bellek nesnesine erişmek istiyorum. server.php:Php ve destek kütüphanesi IPC arasında nasıl iletişim kurulur?

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 ben bu hafıza bölgesini almak için Artıracak vermelidir anahtarın ne tür

<?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_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; 
} 

DÜZENLEME: Eh Boost IPC kütüphane Dokümanlar çözüm buldu

:

XSI_KEY based example from boost Docs

+0

PHP uzantısı, * System V IPC anahtarı * s'yi kullanır; – hakre

+0

Evet, tabi ki, ama sahnenin arkasına gizlenmiş. – Arman

+0

"Sahnenin arkasına gizlenmiş" ile ne demek istiyorsun? – hakre

cevap

1

Ben bir uzman değilim neyi Yapıyorsun, ama ben senin sorunun ve bilgimden okuduğum şeyden, bu saf IPC şeyini bırakıp ZMQ'a yerleştirin (ihtiyacınız olan her dilde sarıcı bulacaksınız). Bu tür sorunları çözmek ve IPC veya daha yaygın bir TCP soketi üzerinden çalışabilen tek bir API sağlamak anlamına gelir.