shmget 报错是因为 sysvshm 扩展默认未启用且 php 8.0+ 移除了旧类型支持;需编译时加 --enable-sysvshm 和 --enable-sysvsem,或改用 sysvsharedmemory::open()。

shmget 在 PHP 8.0 中报 “Call to undefined function” 怎么办
不是函数被“删了”,而是 shmget 所属的 SysV IPC 扩展(sysvshm)默认未启用,且 PHP 8.0+ 彻底移除了旧的 asysvshmresource 类型支持,只保留原生 C 扩展接口。如果你在 phpinfo() 里看不到 sysvshm 模块,那它根本没加载。
确认 sysvshm 扩展是否已编译并启用
先排除配置误判:很多用户以为装了 PHP 就自带共享内存支持,其实 Debian/Ubuntu 的 php8.0 包默认不带 sysvshm;CentOS/RHEL 系的 php-common 也常剥离该模块。
- 运行
php -m | grep sysv,若无输出,说明扩展未启用 - 检查
php.ini是否有extension=sysvshm—— 但更大概率是这行根本不存在,因为模块文件sysvshm.so压根没生成 -
php -i | grep "Configure Command"查看编译参数,若不含--enable-sysvshm,说明编译时就跳过了
重新编译 PHP 时必须加的参数
PHP 源码编译阶段必须显式启用,不能靠后期 dl() 或动态加载补救(dl() 自 PHP 8.0 起已被废弃)。关键参数只有两个,缺一不可:
-
--enable-sysvshm:启用 SysV 共享内存(shmget、shmat等) -
--enable-sysvsem:启用 SysV 信号量(sem_get等),很多共享内存逻辑依赖它做同步,不加会导致运行时报错或死锁
示例 configure 命令片段:./configure --enable-sysvshm --enable-sysvsem --enable-cli --enable-fpm ...
替代方案:用 SysvSharedMemory 类(PHP 8.0+ 唯一推荐方式)
PHP 8.0 引入了 SysvSharedMemory 类,它是完全封装、类型安全的替代品,不再暴露原始 C 句柄。但它要求扩展已启用 —— 也就是说,你仍得先搞定 --enable-sysvshm,否则类本身都不存在。
- 不能直接 new:
SysvSharedMemory是 final 类,无公开构造器 - 必须用
SysvSharedMemory::open()创建实例,第一个参数是 key(int),不是字符串 - 读写需配合
read()/write()方法,不能像老式shmop那样直接指针操作 - 注意:
shmop扩展(shmop_open)和sysvshm是两套独立实现,别混用;PHP 8.0+ 推荐优先走SysvSharedMemory
示例:$shm = SysvSharedMemory::open(0x1234, 1024, 0644); $shm->write("hello");
最常被忽略的一点:即使编译参数全对,如果系统内核禁用了 SysV IPC(比如某些容器镜像或加固策略下 /proc/sys/kernel/msgmax 被设为 0),shmget 仍会返回 false 并触发 EACCES。务必在运行前检查 ipcs -l 输出是否正常。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











