【转】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!' ); |
-
success!
-
[Done] exited with code=0 in 0.287 seconds
-
$ ipcs -m
-
IPC status from <running system> as of Sun Mar 1 00:51:42 CST 2020
-
T ID KEY MODE OWNER GROUP
-
Shared Memory:
-
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 ); |
-
hello world
-
[Done] exited with code=0 in 0.288 seconds
-
$ ipcs -m
-
IPC status from <running system> as of Sun Mar 1 00:55:43 CST 2020
-
T ID KEY MODE OWNER GROUP
-
Shared Memory:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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之间是个什么样的关系