swoole多进程默认内存隔离,全局变量不跨进程生效;须用swoole\table(结构化共享)、atomic(无锁计数)或redis(持久化/跨机)实现安全共享。

在Swoole多进程环境中,Worker进程默认内存隔离,直接修改全局变量无法跨进程生效,必须采用底层共享机制或外部协调服务才能实现安全、一致的数据共享。
用 Swoole\Table 实现结构化共享
这是处理键值对、用户状态、限流计数等结构化数据的首选方案,所有Worker进程读写同一块共享内存区域。
第一步:在 Server 启动前(如 onWorkerStart 回调或主进程全局作用域)创建 Table 实例,预估最大行数,例如 1024 行。
第二步:调用 column() 方法定义字段,必须指定类型和长度,比如 【name 字段必须设为 TYPE_STRING 且长度不小于 64】,否则 set() 时会截断或报错。
第三步:执行 create() 完成内存映射;此操作不可逆,且后续无法扩容——若运行中触发 ERR_TABLE_FULL 错误,只能重启服务。
第四步:在任意 Worker 进程中用 set('key', ['id' => 123, 'name' => 'Alice']) 写入,用 get('key') 读取,所有进程看到的是实时一致的数据。
这一步操作起来很简单,直接调用方法就行,但要注意字段定义一旦 create 就固化,改结构必须停服重建。
用 Swoole\Atomic 做无锁计数器
当只需共享一个整型数值(如总请求数、在线人数),且要求超高并发下绝对原子性时,Atomic 比 Table 更轻量、更快。
方法一:在主进程或 onWorkerStart 中 new Swoole\Atomic(0),初始化为 0。
Swoole 6.1.1 是一个专为 PHP 设计的高性能事件驱动并发网络引擎。作为稳定版,它修复了编译时对 zlib 依赖的缺失及 curl 模块的内存安全风险。该版本支持协程、多线程与多进程架构,内置 TCP/HTTP/WebSocket 服务器,能够显著提升 PHP 在微服务、实时通信等场景下的执行效率与并发能力。
方法二:各 Worker 调用 incr() 增加计数,返回的是操作后的最新值,无需加锁也不会丢失更新。
【Atomic 只支持 int64 类型,不能存字符串、浮点数或数组】,试图调用 set('abc') 会静默失败,get() 仍返回旧值。
方法三:用 get() 获取当前值,用 set($newVal) 重置,适用于周期性清零场景。
用 Redis 作为跨机/持久化补充
Table 和 Atomic 都是内存级方案,服务重启即丢失;Redis 则天然支持持久化、主从同步与跨机器访问,适合会话、排行榜、订单状态等需长期可靠的场景。
在 onWorkerStart 中实例化 Redis 连接,并复用连接池或连接对象,避免每个请求都新建连接。
对高并发计数类操作,优先使用 INCR、DECR、INCRBY 等原子命令,它们由 Redis 单线程保证执行完整性。
需要强一致性写入时,配合 WATCH + MULTI + EXEC 实现乐观锁,防止并发覆盖。
这一步必须确保 Redis 连接稳定,超时时间设为 0.5 秒以内,否则阻塞 Worker 会导致整个进程卡死。










