swoole_mutex互斥锁需在fork前创建并设pthread_process_shared属性才能跨进程使用,否则子进程锁失效;仅支持lock/trylock/unlock,不支持读写分离,易因重复new引发内存泄漏。

SWOOLE_MUTEX 互斥锁:进程间独占,但必须在 fork 前创建
它底层调用 pthread_mutex_init,默认是进程内线程安全的;若要跨进程使用,必须在主进程 fork() 之前创建,并且底层会设置 PTHREAD_PROCESS_SHARED 属性。否则子进程拿到的是独立副本,锁完全失效。
常见错误现象:lock() 在子进程中始终成功,多个进程同时进入临界区,数据被覆盖。
- 只支持
lock()、trylock()、unlock(),不支持读写分离 - 不能在
onReceive或协程回调里反复 new,否则引发内存泄漏(底层使用全局内存池) - 性能中等,适合临界区稍长、并发量不极端的场景
SWOOLE_FILELOCK 文件锁:真正跨进程,依赖文件 inode
本质是 PHP flock() 的封装,靠操作系统对同一文件 inode 的锁状态做同步,所以不要求锁对象是否共享——只要所有进程传入相同路径(如 /tmp/app.lock),就能生效。
使用场景:Worker 进程防重复定时任务、日志轮转、单实例脚本守护。
Swoole 6.1.1 是一个专为 PHP 设计的高性能事件驱动并发网络引擎。作为稳定版,它修复了编译时对 zlib 依赖的缺失及 curl 模块的内存安全风险。该版本支持协程、多线程与多进程架构,内置 TCP/HTTP/WebSocket 服务器,能够显著提升 PHP 在微服务、实时通信等场景下的执行效率与并发能力。
- 构造时必须传路径:
new Swoole\Lock(SWOOLE_FILELOCK, "/tmp/my.lock") -
lock()阻塞,trylock()立即返回,推荐搭配超时重试(比如最多尝试 3 次,每次间隔 100ms) - 不兼容 NFS,避免在挂载的网络文件系统上使用
- 注意锁文件权限:确保所有 Worker 进程有读写权限,否则
open()失败直接报错
SWOOLE_RWLOCK 读写锁:读多写少时提升并发吞吐
允许多个读操作并行,但写操作必须独占。适合缓存更新、配置热加载这类「频繁读 + 偶尔写」的逻辑。
关键限制:必须在父进程创建,子进程继承后才能争抢;不能在协程中使用(会阻塞整个线程)。
- 加读锁用
lock_read(),加写锁用lock_write(),释放统一用unlock() - 不能混用:
lock_read()后调lock_write()会死锁(除非先unlock()) - PHP 8.2+ 中部分环境可能因 glibc 版本问题导致
pthread_rwlock初始化失败,建议上线前验证
SWOOLE_SPINLOCK 自旋锁:极短临界区才值得用
不进入内核态等待,而是循环检查锁状态。优势是无上下文切换开销;劣势是空转耗 CPU,且无法被信号中断。
只适合临界区执行时间远小于一次线程调度延迟的场景(比如几十纳秒级的原子计数包装)。
- 没有
trylock()方法,只有lock()和unlock() - 同样需在 fork 前创建,且仅限本地进程间,不适用于远程或容器隔离环境
- 高负载下容易把某个 CPU 核跑满,监控时注意
%si和%us异常飙升
Lock::MUTEX 等常量已替代旧的 SWOOLE_MUTEX 数值写法,但底层行为没变——别只改常量名,忘了检查创建时机和作用域。










