PHP flock
2021-01-22 本文已影响0人
马六甲的笔记
一共有两种锁,6中组合:
- 共享锁 LOCK_SH
- 独占锁 LOCK_EX
- 外加 [无锁] 状态
LOCK_SH + 无锁
A 进程使用 LOCK_SH ,可以读,可以写。
B 进程无锁,可以读,无法写。(但实测,直接 fwrite 失败,先 fread 一下,然后 fwrite 就可以成功)
LOCK_EX + 无锁
A 进程使用 LOCK_EX,可以读,可以写。
B 进程无锁,无法读(fread 返回空),无法写(fwrite 失败)
LOCK_SH + LOCK_EX
LOCK_EX + LOCK_SH
LOCK_EX + LOCK_EX
- 使用独占锁,在未解锁前,其他进程想要加锁会被阻塞直至解锁为止
- 其他进程加锁,新进程想要使用独占锁,也会被阻塞直到其他进程解锁(哪怕其他进程使用的是共享锁)
例如:
A 进程使用 LOCK_SH ,可以读,可以写。
B 进程使用 LOCK_EX ,会被阻塞,在 A 继承解锁前程序阻塞等待A 进程使用 LOCK_EX ,可以读,可以写。
B 进程使用 LOCK_SH,会被阻塞,在 A 继承解锁前程序阻塞等待
LOCK_SH + LOCK_SH
与 LOCK_SH + 无锁 表现一致
A 进程 LOCK_SH 、B 进程 LOCK_SH 不会被阻塞,可以读,无法写(通用的,先读后写就可以成功)
不同的是,若有 C 进程想使用 LOCK_EX , 必须等待 A B 进程都解锁
LOCK_UN
解锁,没啥好说的
LOCK_NB
用于组合使用,不阻塞,比如
flock($fp, LOCK_EX | LOCK_NB)
由于该特性 Unix Only,尽量不使用,避免程序在跨平台时出现问题