Shared Memory也就是共享内存,是多个进程可以共同访问的一块内存区域,相比文件、数据库等进程间通信方式,它的读写速度更快,非常适合存储临时、高频访问的共享数据。PHP的shmop扩展提供了一组操作共享内存的函数,不过默认情况下该扩展可能没有开启,需要手动配置后才能使用。

一、开启shmop扩展的配置方法
1. Linux环境配置
Linux系统下PHP一般通过编译安装或者包管理器安装,不同安装方式开启shmop扩展的步骤略有不同。
如果是编译安装的PHP,需要重新编译PHP并加上--enable-shmop参数,具体步骤如下:
# 进入PHP源码目录 cd /path/to/php-source # 执行编译配置,加入shmop支持 ./configure --enable-shmop --其他原有编译参数 # 编译并安装 make && make install # 重启PHP服务 systemctl restart php-fpm
如果是通过apt或者yum包管理器安装的PHP,可以直接安装对应的扩展包:
# Ubuntu/Debian系统 sudo apt-get install php-shmop # CentOS/RHEL系统 sudo yum install php-shmop # 安装完成后重启PHP服务 systemctl restart php-fpm
2. Windows环境配置
Windows环境下开启shmop扩展更简单,首先找到PHP安装目录下的php.ini配置文件,搜索extension=shmop,如果该行前面有分号注释,去掉分号即可。如果找不到这一行,手动添加extension=shmop,保存后重启Apache或者IIS服务即可生效。
3. 验证扩展是否开启成功
配置完成后,可以通过phpinfo()函数验证扩展是否成功加载,在PHP文件中写入以下代码:
<?php phpinfo(); ?>
访问该文件,搜索shmop,如果能看到shmop的相关信息,说明扩展已经成功开启。
二、shmop扩展的核心函数说明
shmop扩展提供了一系列操作共享内存的函数,常用的函数如下:
| 函数名 | 功能说明 |
|---|---|
| shmop_open | 打开或创建一块共享内存 |
| shmop_write | 向共享内存中写入数据 |
| shmop_read | 从共享内存中读取数据 |
| shmop_size | 获取共享内存的大小 |
| shmop_delete | 删除共享内存块 |
| shmop_close | 关闭共享内存的引用 |
三、Shared Memory的使用示例
1. 创建并写入共享内存
下面的示例演示了如何创建一块共享内存,并向其中写入数据:
<?php
// 共享内存的key,用于唯一标识共享内存块
$shm_key = ftok(__FILE__, 't');
// 共享内存的大小,单位是字节,这里设置为1024字节
$shm_size = 1024;
// 打开共享内存,如果不存在则创建,权限为0666,表示所有用户可读可写
$shm_id = shmop_open($shm_key, "c", 0666, $shm_size);
if (!$shm_id) {
die("创建共享内存失败");
}
// 要写入的数据
$data = "这是写入共享内存的测试数据";
// 写入数据,从偏移量0开始写入
$write_result = shmop_write($shm_id, $data, 0);
if ($write_result) {
echo "数据写入共享内存成功,写入长度:" . $write_result . "字节";
} else {
echo "数据写入共享内存失败";
}
// 关闭共享内存引用
shmop_close($shm_id);
?>
2. 读取共享内存数据
另一段进程可以通过以下代码读取刚才写入的共享内存数据:
<?php
// 使用相同的key获取共享内存
$shm_key = ftok(__FILE__, 't');
// 打开共享内存,使用"a"模式表示只读打开
$shm_id = shmop_open($shm_key, "a", 0, 0);
if (!$shm_id) {
die("打开共享内存失败");
}
// 获取共享内存的大小
$shm_size = shmop_size($shm_id);
// 读取共享内存中的数据,从偏移量0开始读取全部内容
$data = shmop_read($shm_id, 0, $shm_size);
// 输出读取到的数据
echo "从共享内存读取到的数据:" . $data;
// 关闭共享内存引用
shmop_close($shm_id);
?>
3. 删除共享内存
当共享内存不再使用时,需要及时删除,避免占用系统资源,删除示例如下:
<?php
$shm_key = ftok(__FILE__, 't');
$shm_id = shmop_open($shm_key, "a", 0, 0);
if ($shm_id) {
// 删除共享内存块
shmop_delete($shm_id);
// 关闭引用
shmop_close($shm_id);
echo "共享内存删除成功";
} else {
echo "共享内存不存在";
}
?>
四、使用注意事项
- 共享内存的key需要保证唯一性,避免不同业务使用相同的key导致数据冲突,可以使用
ftok()函数结合文件路径生成唯一的key。 - 共享内存中的数据没有持久化,系统重启后共享内存中的数据会丢失,因此不适合存储需要长期保存的重要数据。
- 多进程同时操作共享内存时,需要考虑并发问题,避免数据读写冲突,可以结合信号量等机制实现进程同步。
- 共享内存的大小需要在创建时指定,后续无法动态扩容,因此需要根据实际业务需求合理设置大小。
PHPShared_Memoryshmop扩展修改时间:2026-06-19 02:33:44