协程并发需避免全局变量污染,应使用swoole\atomic(整型原子操作)、swoole\table(结构化共享数据,支持cas)和swoole\channel(协程安全通信)来保障数据一致性。

当多个协程同时读写数据库连接、计数器或共享内存变量时,数据错乱、覆盖、丢失就会立刻发生,这不是概率问题,而是必然结果。
用协程隔离避免全局污染
协程启动时自动创建独立的上下文空间,所有局部变量天然隔离。直接在协程函数内声明变量即可,无需额外加锁。
这一步操作起来很简单,直接把文件拖进去就行。
但【切勿在协程外定义并复用全局变量】——比如在go()外面new一个对象,再传进多个协程里修改,这种写法会立即引发竞争。
用Swoole\Atomic做原子计数
第一步:实例化一个Atomic对象,例如$counter = new Swoole\Atomic(0);
第二步:在协程中调用$counter->add(1)或$counter->get(),这些方法底层由CPU指令保证不可分割。
第三步:获取最终值只需$counter->get(),返回整数,线程安全,无需判断是否被其他协程中途修改。
注意:Atomic只支持整型,不能存字符串或数组;若需更复杂结构,请转向Table或Channel。
用Swoole\Table管理结构化共享数据
方法一:定义表结构后直接写入
Swoole 6.1.1 是一个专为 PHP 设计的高性能事件驱动并发网络引擎。作为稳定版,它修复了编译时对 zlib 依赖的缺失及 curl 模块的内存安全风险。该版本支持协程、多线程与多进程架构,内置 TCP/HTTP/WebSocket 服务器,能够显著提升 PHP 在微服务、实时通信等场景下的执行效率与并发能力。
$table = new Swoole\Table(1024); $table->column('uid', Swoole\Table::TYPE_INT, 8); $table->column('score', Swoole\Table::TYPE_INT, 4); $table->create(); $table->set("user_123", ['uid' => 123, 'score' => 95]);
方法二:并发更新时用CAS机制
$table->cas("user_123", "score", 95, 96); ——仅当当前值为95时才更新为96,失败返回false,避免覆盖。
【必须在Server启动前完成Table创建】,运行中无法动态新增列或扩容,否则报错退出进程。
用Swoole\Channel实现协程间安全通信
创建容量为100的通道:$chan = new Swoole\Channel(100);
生产者协程调用$chan->push($data),消费者协程调用$chan->pop(),阻塞/超时行为可配置。
Channel本质是内存队列,内部已加锁,push/pop天然线程安全,适合解耦任务分发与执行逻辑。
不要用PHP原生array模拟队列——多个协程同时array_push/array_shift会导致键冲突或丢数据。










