1. 程式人生 > 實用技巧 >【轉】PHP使用共享記憶體程序間通訊

【轉】PHP使用共享記憶體程序間通訊

原文:https://blog.csdn.net/why444216978/article/details/104585099

https://www.cnblogs.com/nickbai/articles/6124466.html

共享記憶體:使得多個程序可以訪問同一塊記憶體空間,是最快的可用IPC形式。是針對其他通訊機制執行效率較低而設計的。往往與其它通訊機制,如訊號量結合使用,來達到程序間的同步及互斥。

一.Linux下程序間通訊的幾種主要手段簡介:

1.管道(Pipe)及有名管道(named pipe):管道可用於具有親緣關係程序間的通訊,有名管道克服了管道沒有名字的限制,因此,除具有管道所具有的功能外,它還允許無親緣關係程序間的通訊;

管道包括三種:1)普通管道PIPE, 通常有種限制,一是半雙工,只能單向傳輸;二是隻能在父子程序間使用. 2)流管道s_pipe: 去除了第一種限制,可以雙向傳輸. 3)命名管道:name_pipe, 去除了第二種限制,可以在許多並不相關的程序之間進行通訊.

2.訊號(Signal):訊號是比較複雜的通訊方式,用於通知接受程序有某種事件發生,除了用於程序間通訊外,程序還可以傳送訊號給程序本身;Linux除了支援Unix早期訊號語義函式sigal外,還支援語義符合Posix.1標準的訊號函式sigaction(實際上,該函式是基於BSD的,BSD為了實現可靠訊號機制,又能夠統一對外介面,用sigaction函式重新實現了signal函式);

3.報文(Message)佇列(訊息佇列):訊息佇列是訊息的連結表,包括Posix訊息佇列systemV訊息佇列。有足夠許可權的程序可以向佇列中新增訊息,被賦予讀許可權的程序則可以讀走佇列中的訊息。訊息佇列克服了訊號承載資訊量少,管道只能承載無格式位元組流以及緩衝區大小受限等缺點。

4.共享記憶體:使得多個程序可以訪問同一塊記憶體空間,是最快的可用IPC形式。是針對其他通訊機制執行效率較低而設計的。往往與其它通訊機制,如訊號量結合使用,來達到程序間的同步及互斥。

5.訊號量(semaphore):主要作為程序間以及同一程序不同執行緒之間的同步手段。

6.套介面(Socket):更為一般的程序間通訊機制,可用於不同機器之間的程序間通訊。起初是由Unix系統的BSD分支開發出來的,但現在一般可以移植到其它類Unix系統上:Linux和System V的變種都支援套接字。

-----------------------------------

建立並寫入資料

  

<?php
$file = __FILE__;
$key = ftok($file, 1);
$size = 4096;
$shmid = shmop_open($key, 'c', 0644, $size);
if($shmid === false){
    die('create fail');
}
 
$data = 'hello world';
$packData = pack('a*', $data); //資料壓縮成二進位制字串,null填充
$dataSize = shmop_write($shmid, $packData, 0);  //第三個引數代表開始寫入資料的位置
if($dataSize === false){
    die('write fail');
}
shmop_close($shmid);
exit('success!');

  

  1. success!
  2. [Done] exited with code=0 in 0.287 seconds
  1. $ ipcs -m
  2. IPC status from <running system> as of Sun Mar 1 00:51:42 CST 2020
  3. T ID KEY MODE OWNER GROUP
  4. Shared Memory:
  5. m 983040 0x31040c43 --rw-r--r-- why staff

另一個程序讀取並釋放

  

<?php
$file = __FILE__;
$key = ftok($file, 1);
$size = 4096;
$shmid = shmop_open($key, 'a', 0644, $size);
if($shmid === false){
    die('create fail');
}
 
$data = shmop_read($shmid, 0, $size);
if($data === false){
    die('read fail');
}
$res = unpack('a*', $data);
print_r($res[1]);
 
$res = shmop_delete($shmid);
if($res === false){
    die('delete fail');
}
shmop_close($shmid);

  

  1. hello world
  2. [Done] exited with code=0 in 0.288 seconds
  1. $ ipcs -m
  2. IPC status from <running system> as of Sun Mar 1 00:55:43 CST 2020
  3. T ID KEY MODE OWNER GROUP
  4. Shared Memory: