好好爱自己!

【转】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的变种都支持套接字。

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

创建并写入数据

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?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

另一个进程读取并释放

 

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?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 @   立志做一个好的程序员  阅读(201)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
历史上的今天:
2017-12-25 介绍css 的3D 变换(3D transform)
2016-12-25 “psql: could not connect to server: Connection refused” Error when connecting to remote database
2016-12-25 postgreSqL的序列sequence
2016-12-25 nginx+php-fpm 的配置下,php的错误日志
2015-12-25 FastCgi与PHP-fpm之间是个什么样的关系

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

点击右上角即可分享
微信分享提示