好好爱自己!

【转】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:

 

posted @ 2020-12-25 20:00  立志做一个好的程序员  阅读(178)  评论(0编辑  收藏  举报

不断学习创作,与自己快乐相处