thinkphp 5.1中通过think-swoole封装swoole table实现进程间共享内存,需在swoole.php中配置tables、确保size为2的幂次、重启服务自动初始化;控制器中用app("swoole.table.goods")获取实例,支持set写入、get读取、decr原子减库存;服务关闭时须显式调用destroy()释放共享内存,否则导致shmop_open错误。

在ThinkPHP 5.1中使用Swoole Table存储进程内共享数据,是为了让多个Worker进程能实时读写同一份内存状态,比如库存扣减、用户在线数统计、高频配置缓存——它不经过Redis或数据库,直接驻留于共享内存,但必须通过think-swoole封装层正确初始化,否则表对象为空或操作失效。
配置并初始化Table内存表
第一步:打开config/swoole.php文件,在tables配置项下定义一张新表,例如商品库存表:
'goods' => [ 'size' => 1024, 'columns' => [ ['name' => 'id', 'type' => \SWOOLE\Table::TYPE_INT], ['name' => 'sku', 'type' => \SWOOLE\Table::TYPE_STRING, 'size' => 32], ['name' => 'kucun', 'type' => \SWOOLE\Table::TYPE_INT] ] ]
第二步:确保size值是2的幂次(如1024、2048),【若填1000,框架会自动向上取整为1024,但填1025则仍按1025处理,可能导致create()失败】。
第三步:保存配置后重启Swoole服务,think-swoole会在Server启动前自动调用create()完成内存分配。此时表已就绪,无需手动new Swoole\Table。
在控制器中存取Table数据
方法一:获取表对象并写入整行数据
在控制器中调用app("swoole.table.goods")获取已注册的Table实例;
执行$goods->set('SKU001', ['id' => 1, 'sku' => 'SKU001', 'kucun' => 99]);——【key最大长度63字节,超长会被截断且无提示】;
这一步操作起来很简单,直接把关联数组丢进去就行。
方法二:安全读取并原子减库存
先用$goods->get('SKU001')获取当前行,返回数组或false;
别用empty()判断是否存在,必须用=== false;
库存扣减必须用$goods->decr('SKU001', 'kucun', 1),底层走CPU原子指令,避免并发覆盖;
注意:decr只对TYPE_INT字段生效,对TYPE_STRING字段调用会静默失败。
销毁Table释放共享内存
第一步:在onShutdown或onWorkerStop回调中,获取表对象并显式调用destroy();
第二步:执行app("swoole.table.goods")->destroy();;
第三步:确认该操作被执行——若服务重启后出现shmop_open(): unable to open or create shared memory segment错误,说明上一次未成功destroy;
这一步不可省略,因为Swoole\Table基于mmap,unset()或进程退出都不会自动释放内存块。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











