php中进程间通信介绍的很少,今天我来学习学习怎么实现共享内存的实现

  • 安装

安装地址

需要在安装的时候添加 –enable-shmop 来启用该函数的功能

可以通过 phpinfo(); 来确认是否安装成功,我这里查看 shmop support => enabled 代表启用成功了

  • 主要函数
1
2
3
4
5
6
shmop_close — 关闭共享内存块
shmop_delete — 删除共享内存块
shmop_open — 创建或打开共享内存块
shmop_read — 从共享内存块中读取数据
shmop_size — 获取共享内存块的大小
shmop_write — 向共享内存块中写入数据

与此相关的还有一个很重要的函数:ftok,通过文件的 inode 信息(nix 上通过 statls -i 命令查看)创建 IPC 的唯一 key(文件/文件夹的 inode 是唯一的)。这个函数在 Linux 上也是直接调用同名的系统函数实现,Windows 上还是使用一些封装。

有个需要稍微注意的点:shmop_open 的第二个参数是个 flag,类似 fopen 的第二个参数,其取值有以前几个:

1
2
3
4
5
6
“a” 只读访问
“c” 如果内存片段不存在,则创建,如果存在,则可读写;

“w” 读写;

“n” 创建新的内存片段,如果同样 key 的已存在,则会创建失败,这是为了安全使用共享内存考虑。
  • 程序
1
2
3
4
5
6
7
8
9
10
//新建一块共享内存(并取得唯一nodeID)
$shm_key = ftok(__FILE__,'t');
//打开改共享内存文件,采用片段不存在则创建策略
$shm_id = shmop_open($shm_key,'c',0644,8);
# 读取读取共享内存(8字节读取)
$count = (int) shmop_read($shm_id, 0, 8) + 1;

shmop_write($shm_id, str_pad($count, 8, '0', STR_PAD_LEFT), 0);
echo $count;
shmop_close($shm_id);
  • 运行效果图

即使进程关闭重新开启依然能够正常读取数据!

效果图

一定要把握长度,否则可能出现读取异常的问题